diff options
author | Matthias Berndt <matthias_berndt@gmx.de> | 2016-09-29 23:27:21 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2016-12-01 14:26:01 +0100 |
commit | 5c41e5d0928b2a1c0e143eaee843cdc30ad87f35 (patch) | |
tree | 3da7ba430f04e653f4e64e23caa3e6089ff40023 | |
parent | 75b292f461b42765619ad4720ff64e9d985a312f (diff) | |
download | vala-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.am | 1 | ||||
-rw-r--r-- | tests/delegates/bug772204.test | 7 | ||||
-rw-r--r-- | vala/valadelegatetype.vala | 18 |
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 () { |