summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2022-05-31 10:19:46 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2022-05-31 10:19:46 +0200
commit46ef198a5de5e6abb0322da2e7b92cd8541c9377 (patch)
treed2917253b018c86af94e24251115de6020a3ba99
parentaf49df1b21849418af6a839519df93eb04e0d827 (diff)
downloadvala-46ef198a5de5e6abb0322da2e7b92cd8541c9377.tar.gz
codegen: Detect usage of static type-parameter in runtime context
Compact classes doesn't carry runtime information of its type-parameters. In case this information is required we need report an error. Fixes https://gitlab.gnome.org/GNOME/vala/issues/1326
-rw-r--r--codegen/valaccodebasemodule.vala5
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/generics/type-parameter-static-in-runtime.test14
3 files changed, 20 insertions, 0 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 50dbbea8f..121344373 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -3048,6 +3048,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
public CCodeExpression get_type_id_expression (DataType type, bool is_chainup = false) {
if (type is GenericType) {
var type_parameter = ((GenericType) type).type_parameter;
+ unowned Symbol? parent = type_parameter.owner.owner;
+ if (parent is Class && ((Class) parent).is_compact) {
+ Report.error (type.source_reference, "static type-parameter `%s' can not be used in runtime context", type.type_symbol.get_full_name ());
+ return new CCodeInvalidExpression();
+ }
string identifier = get_ccode_type_id (type_parameter);
return get_generic_type_expression (identifier, (GenericType) type, is_chainup);
} else {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0d0fca034..3dd2cad45 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -790,6 +790,7 @@ TESTS = \
generics/string-literal-comparison.vala \
generics/type-parameter-properties.vala \
generics/type-parameter-property-clash.vala \
+ generics/type-parameter-static-in-runtime.test \
generics/value-pointer-type-access.vala \
generics/bug640330.vala \
generics/bug640330-2.test \
diff --git a/tests/generics/type-parameter-static-in-runtime.test b/tests/generics/type-parameter-static-in-runtime.test
new file mode 100644
index 000000000..f6b6317fe
--- /dev/null
+++ b/tests/generics/type-parameter-static-in-runtime.test
@@ -0,0 +1,14 @@
+Invalid Code
+
+[Compact]
+class Foo<T> {
+ public Bar<T> bar () {
+ return new Bar<T> ();
+ }
+}
+
+class Bar<T> {
+}
+
+void main () {
+}