summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2019-03-10 22:16:45 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-03-22 22:01:39 +0100
commit0806e5d63b0131fb67aa8a58a61a6630aa593513 (patch)
tree020f72652265975ad7736e860afb3112a3ad1e13
parentf83ecd81d6ede886e1d2573c60da28b993db89e3 (diff)
downloadvala-wip/limited-generics.tar.gz
codegen: Don't apply strict generic-type rules on simple/limited genericswip/limited-generics
-rw-r--r--codegen/valaccodebasemodule.vala10
-rw-r--r--tests/generics/parameter-sizeof-initializer.vala4
2 files changed, 12 insertions, 2 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 7b34ec7af..6b951a16f 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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) {
diff --git a/tests/generics/parameter-sizeof-initializer.vala b/tests/generics/parameter-sizeof-initializer.vala
index 1dcc56e1a..0797d2449 100644
--- a/tests/generics/parameter-sizeof-initializer.vala
+++ b/tests/generics/parameter-sizeof-initializer.vala
@@ -14,6 +14,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);
}