diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-05-31 10:19:46 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2022-05-31 10:19:46 +0200 |
commit | 46ef198a5de5e6abb0322da2e7b92cd8541c9377 (patch) | |
tree | d2917253b018c86af94e24251115de6020a3ba99 | |
parent | af49df1b21849418af6a839519df93eb04e0d827 (diff) | |
download | vala-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.vala | 5 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/generics/type-parameter-static-in-runtime.test | 14 |
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 () { +} |