summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2014-01-11 17:04:02 +0100
committerLuca Bruno <lucabru@src.gnome.org>2014-01-11 17:04:06 +0100
commite15a795130250de68c4ea9bf3205c58865732869 (patch)
tree29e677d94ca8a02522246cab5213183ff6c4f52f
parent58259ec0ef06548786a0d650c568267f5a6f0f17 (diff)
downloadvala-e15a795130250de68c4ea9bf3205c58865732869.tar.gz
codegen: Support "foo is G"
-rw-r--r--codegen/valaccodebasemodule.vala6
-rw-r--r--tests/methods/generics.vala11
2 files changed, 14 insertions, 3 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 4f049c1e6..488d434b1 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -5349,13 +5349,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
var type_domain = new CCodeIdentifier (get_ccode_upper_case_name (et.error_domain));
return new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, instance_domain, type_domain);
} else {
- string type_id = get_ccode_type_id (type.data_type);
- if (type_id == "") {
+ var type_id = get_type_id_expression (type);
+ if (type_id == null) {
return new CCodeInvalidExpression ();
}
var ccheck = new CCodeFunctionCall (new CCodeIdentifier ("G_TYPE_CHECK_INSTANCE_TYPE"));
ccheck.add_argument ((CCodeExpression) ccodenode);
- ccheck.add_argument (new CCodeIdentifier (type_id));
+ ccheck.add_argument (type_id);
return ccheck;
}
}
diff --git a/tests/methods/generics.vala b/tests/methods/generics.vala
index b4655239a..27e9cc16e 100644
--- a/tests/methods/generics.vala
+++ b/tests/methods/generics.vala
@@ -4,6 +4,9 @@ interface Foo : Object {
}
}
+class Bar {
+}
+
class Baz : Object, Foo {
}
@@ -11,6 +14,11 @@ void foo<T> (owned T bar) {
bar = null;
}
+bool is_check<G> () {
+ var o = new Bar ();
+ return o is G;
+}
+
void main () {
var bar = new Object ();
foo<Object> (bar);
@@ -19,4 +27,7 @@ void main () {
var baz = new Baz ();
baz.foo<Object> (bar);
assert (baz.ref_count == 1);
+
+ assert (is_check<Bar> ());
+ assert (!is_check<Baz> ());
}