From 0b2e7537e5575f1daabb37e93b5f74c78fd29eff Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Thu, 13 Apr 2023 08:25:02 +0200 Subject: codegen: Return CCodeInvalidExpression instead of null This fixes the following criticals: vala_ccode_cast_expression_construct: assertion 'expr != NULL' failed vala_ccode_function_call_add_argument: assertion 'expr != NULL' failed Remove dead code, this is already handled in get_dup_func_expression() --- codegen/valaccodebasemodule.vala | 7 ++----- tests/Makefile.am | 1 + tests/semantic/interface-prerequisite-missing-class.test | 11 +++++++++++ 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 tests/semantic/interface-prerequisite-missing-class.test diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 51d402712..d1e665747 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -3519,7 +3519,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { unref_function = get_ccode_unref_function ((ObjectTypeSymbol) type.type_symbol); if (type.type_symbol is Interface && unref_function == null) { Report.error (type.source_reference, "missing class prerequisite for interface `%s', add GLib.Object to interface declaration if unsure", type.type_symbol.get_full_name ()); - return null; + return new CCodeInvalidExpression (); } } else { if (get_ccode_is_gboxed (type.type_symbol)) { @@ -6296,10 +6296,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { if (!gvalue_boxing && !gvariant_boxing && target_type.value_owned && (!type.value_owned || boxing || unboxing || array_needs_copy) && requires_copy (target_type) && !(type is NullType)) { // need to copy value var copy = (GLibValue) copy_value (result, node); - if (target_type.type_symbol is Interface && copy == null) { - Report.error (node.source_reference, "missing class prerequisite for interface `%s', add GLib.Object to interface declaration if unsure", target_type.type_symbol.get_full_name ()); - return result; - } + // need to free old array after copying it if (array_needs_copy && requires_destroy (type)) { result.value_type = type.copy (); diff --git a/tests/Makefile.am b/tests/Makefile.am index 2e22aa6db..b7a46cb31 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1191,6 +1191,7 @@ TESTS = \ semantic/initializer-unknown-type.test \ semantic/interface-prerequisite-invalid.test \ semantic/interface-prerequisite-less-accessible.test \ + semantic/interface-prerequisite-missing-class.test \ semantic/interface-prerequisite-multiple.test \ semantic/interface-prerequisite-too-few-type-arguments.test \ semantic/interface-prerequisite-too-many-type-arguments.test \ diff --git a/tests/semantic/interface-prerequisite-missing-class.test b/tests/semantic/interface-prerequisite-missing-class.test new file mode 100644 index 000000000..3e4a9e3fb --- /dev/null +++ b/tests/semantic/interface-prerequisite-missing-class.test @@ -0,0 +1,11 @@ +Invalid Code + +interface IFoo { +} + +class Foo { +} + +void main () { + var foo = new Foo (); +} -- cgit v1.2.1