]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Enforce required type-arguments on parameter/return types of callables
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 1 Aug 2022 12:32:06 +0000 (14:32 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 9 Aug 2022 06:44:28 +0000 (08:44 +0200)
This stricter check applies to delegate types in source files only.

Fixes https://gitlab.gnome.org/GNOME/vala/issues/1342

tests/Makefile.am
tests/generics/delegate-return-type-missing.test [new file with mode: 0644]
tests/generics/method-parameter-type-missing.test [new file with mode: 0644]
tests/generics/method-return-type-missing.test [new file with mode: 0644]
tests/generics/signal-return-type-missing.test [new file with mode: 0644]
vala/valadelegate.vala
vala/valamethod.vala
vala/valaparameter.vala
vala/valasignal.vala

index 48e9d37d7628bfb29a792be3d6edf7f578963603..f5e0cb8ffb296f685c1561335571fd5b769bfcdc 100644 (file)
@@ -769,6 +769,7 @@ TESTS = \
        generics/arrays-not-supported-2.test \
        generics/arrays-not-supported-3.test \
        generics/constructor-chain-up.vala \
+       generics/delegate-return-type-missing.test \
        generics/floating-type-cast.vala \
        generics/gvariant-serialization.test \
        generics/inference-argument-may-fail.vala \
@@ -779,14 +780,17 @@ TESTS = \
        generics/parameter-invalid-initializer.test \
        generics/parameter-sizeof-initializer.vala \
        generics/member-dup-destroy.vala \
+       generics/method-parameter-type-missing.test \
        generics/method-parameter-unknown-type-parameter.test \
        generics/method-parameter-unknown-type-parameter-2.test \
+       generics/method-return-type-missing.test \
        generics/method-return-unknown-type-parameter.test \
        generics/method-return-unknown-type-parameter-2.test \
        generics/null-type.vala \
        generics/property-gobject-set.vala \
        generics/property-int-cast.vala \
        generics/reference-transfer.vala \
+       generics/signal-return-type-missing.test \
        generics/string-literal-comparison.vala \
        generics/type-parameter-properties.vala \
        generics/type-parameter-property-clash.vala \
diff --git a/tests/generics/delegate-return-type-missing.test b/tests/generics/delegate-return-type-missing.test
new file mode 100644 (file)
index 0000000..b2ab8fb
--- /dev/null
@@ -0,0 +1,8 @@
+Invalid Code
+
+delegate T FooFunc<T> ();
+
+delegate FooFunc BarFunc ();
+
+void main () {
+}
diff --git a/tests/generics/method-parameter-type-missing.test b/tests/generics/method-parameter-type-missing.test
new file mode 100644 (file)
index 0000000..cc41978
--- /dev/null
@@ -0,0 +1,9 @@
+Invalid Code
+
+delegate T FooFunc<T> ();
+
+void foo (FooFunc f) {
+}
+
+void main () {
+}
diff --git a/tests/generics/method-return-type-missing.test b/tests/generics/method-return-type-missing.test
new file mode 100644 (file)
index 0000000..313f53f
--- /dev/null
@@ -0,0 +1,10 @@
+Invalid Code
+
+delegate T FooFunc<T> ();
+
+FooFunc bar () {
+       return null;
+}
+
+void main () {
+}
diff --git a/tests/generics/signal-return-type-missing.test b/tests/generics/signal-return-type-missing.test
new file mode 100644 (file)
index 0000000..35c77a1
--- /dev/null
@@ -0,0 +1,10 @@
+Invalid Code
+
+delegate T FooFunc<T> ();
+
+class Foo {
+       public signal FooFunc bar ();
+}
+
+void main () {
+}
index eeaabcb69445fbdc535dc59994e687154b447a27..cb53d2e9194954d60160f4f9880af83fd12b534b 100644 (file)
@@ -319,6 +319,12 @@ public class Vala.Delegate : TypeSymbol, Callable {
                }
 
                return_type.check (context);
+               if (!external_package) {
+                       context.analyzer.check_type (return_type);
+                       if (return_type is DelegateType) {
+                               return_type.check_type_arguments (context);
+                       }
+               }
 
                if (return_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
                        error = true;
index 2794cd48eb312d6f29e68bfe24be4d41c5fc6b7a..8c5c3af560c08b0c2133659c30b3bcdacc645a69 100644 (file)
@@ -866,6 +866,9 @@ public class Vala.Method : Subroutine, Callable {
                return_type.check (context);
                if (!external_package) {
                        context.analyzer.check_type (return_type);
+                       if (return_type is DelegateType) {
+                               return_type.check_type_arguments (context);
+                       }
                }
 
                if (return_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
index 656188848dd4dff6121692dce57682de1990e8b5..fb68ab069d15d0bf9e924b8ec49c1fe40e4b259f 100644 (file)
@@ -208,6 +208,9 @@ public class Vala.Parameter : Variable {
                if (!ellipsis) {
                        if (!external_package) {
                                context.analyzer.check_type (variable_type);
+                               if (variable_type is DelegateType) {
+                                       variable_type.check_type_arguments (context);
+                               }
 
                                // check symbol availability
                                if ((parent_symbol == null || !parent_symbol.external_package) && variable_type.type_symbol != null) {
index ffd5a760affea6aa490b57bf84d31da9e6d68755..2b5005e3b2897dba2505e7576fd96ab0f96cd9db 100644 (file)
@@ -206,6 +206,12 @@ public class Vala.Signal : Symbol, Callable {
                }
 
                return_type.check (context);
+               if (!external_package) {
+                       context.analyzer.check_type (return_type);
+                       if (return_type is DelegateType) {
+                               return_type.check_type_arguments (context);
+                       }
+               }
 
                if (return_type.type_symbol == context.analyzer.va_list_type.type_symbol) {
                        error = true;