summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Berndt <matthias_berndt@gmx.de>2016-09-29 23:27:21 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2016-12-01 14:26:01 +0100
commit5c41e5d0928b2a1c0e143eaee843cdc30ad87f35 (patch)
tree3da7ba430f04e653f4e64e23caa3e6089ff40023
parent75b292f461b42765619ad4720ff64e9d985a312f (diff)
downloadvala-wip/generics.tar.gz
vala: Check delegate type parameter paritywip/generics
https://bugzilla.gnome.org/show_bug.cgi?id=772204
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/delegates/bug772204.test7
-rw-r--r--vala/valadelegatetype.vala18
3 files changed, 25 insertions, 1 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ba8895135..73f609d5c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -138,6 +138,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
index 000000000..5c4e3a06a
--- /dev/null
+++ b/tests/delegates/bug772204.test
@@ -0,0 +1,7 @@
+Invalid Code
+
+delegate void foo<T> ();
+
+void main () {
+ foo f = null;
+}
diff --git a/vala/valadelegatetype.vala b/vala/valadelegatetype.vala
index 11ba57f00..62860d44b 100644
--- a/vala/valadelegatetype.vala
+++ b/vala/valadelegatetype.vala
@@ -113,10 +113,26 @@ public class Vala.DelegateType : DataType {
}
public override bool check (CodeContext context) {
+ if (checked) {
+ return !error;
+ }
+
+ error = false;
+
if (is_called_once && !value_owned) {
Report.warning (source_reference, "delegates with scope=\"async\" must be owned");
}
- return delegate_symbol.check (context);
+
+ var n_type_params = delegate_symbol.get_type_parameters ().size;
+ var n_type_args = get_type_arguments ().size;
+ if (n_type_args != n_type_params) {
+ Report.error (source_reference, "%d type parameter(s) required, %d given".printf (n_type_params, n_type_args));
+ error = true;
+ }
+
+ error = error || !delegate_symbol.check (context);
+ checked = true;
+ return !error;
}
public override bool is_disposable () {