From 79c5626ade51e5c57f21eb8609ad2697cef3419f Mon Sep 17 00:00:00 2001 From: Lorenz Wildberg Date: Mon, 24 Jul 2023 22:44:52 +0200 Subject: [PATCH] Fix access to type parameters --- codegen/valaccodebasemodule.vala | 27 +++++++++++++++++++++------ vala/valatypeparameter.vala | 4 ++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index ffdfbd143..e733faa60 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -2980,8 +2980,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { 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); + if (!type_parameter.no_generic_args) { + string identifier = get_ccode_type_id (type_parameter); + return get_generic_type_expression (identifier, (GenericType) type, is_chainup); + } else { + var constrained_type = type_parameter.get_constrained_type (); + return new CCodeIdentifier (get_ccode_type_id (constrained_type)); + } } else { string type_id = get_ccode_type_id (type); if (type_id == "") { @@ -2998,8 +3003,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { return new CCodeIdentifier ("g_error_copy"); } else if (type is GenericType) { var type_parameter = ((GenericType) type).type_parameter; - string identifier = get_ccode_copy_function (type_parameter); - return get_generic_type_expression (identifier, (GenericType) type, is_chainup); + if (!type_parameter.no_generic_args) { + string identifier = get_ccode_copy_function (type_parameter); + return get_generic_type_expression (identifier, (GenericType) type, is_chainup); + } else { + var constrained_type = type_parameter.get_constrained_type (); + return new CCodeIdentifier (get_ccode_ref_function (constrained_type.type_symbol)); + } } else if (type.type_symbol != null) { string dup_function; unowned Class? cl = type.type_symbol as Class; @@ -3552,8 +3562,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { return new CCodeIdentifier ("g_error_free"); } else if (type is GenericType) { var type_parameter = ((GenericType) type).type_parameter; - string identifier = get_ccode_destroy_function (type_parameter); - return get_generic_type_expression (identifier, (GenericType) type, is_chainup); + if (!type_parameter.no_generic_args) { + string identifier = get_ccode_destroy_function (type_parameter); + return get_generic_type_expression (identifier, (GenericType) type, is_chainup); + } else { + var constrained_type = type_parameter.get_constrained_type (); + return new CCodeIdentifier (get_ccode_unref_function ((ObjectTypeSymbol) constrained_type.type_symbol)); + } } else if (type.type_symbol != null) { string unref_function; if (type is ReferenceType) { diff --git a/vala/valatypeparameter.vala b/vala/valatypeparameter.vala index 95a8c1745..a377fe0ce 100644 --- a/vala/valatypeparameter.vala +++ b/vala/valatypeparameter.vala @@ -171,8 +171,8 @@ public class Vala.TypeParameter : TypeSymbol { error = true; } - if (no_generic_args && !has_type_constraints ()) { - Report.error (source_reference, "type parameters need to be constrained for using `no_generic_args'"); + if (no_generic_args && (!has_type_constraints () || !(get_constrained_type ().type_symbol is ObjectTypeSymbol))) { + Report.error (source_reference, "type parameters need to be constrained with an object type for using `no_generic_args'"); error = true; } -- 2.47.2