From 6cfd53bf57e6875aa70dd22f6b2b1b5407c804df Mon Sep 17 00:00:00 2001 From: Henrixounez <30901439+Henrixounez@users.noreply.github.com> Date: Sun, 11 Apr 2021 23:43:19 +0200 Subject: [PATCH] cgen: generate interfaces after all other typedefs (#9680) --- vlib/v/gen/c/cgen.v | 11 ++++++++--- vlib/v/tests/interface_fields_typearray_test.v | 7 +++++++ 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/interface_fields_typearray_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index bafbce455b..e49efbe79c 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -791,9 +791,6 @@ pub fn (mut g Gen) write_typedef_types() { } } } - .interface_ { - g.write_interface_typesymbol_declaration(typ) - } .chan { if typ.name != 'chan' { g.type_definitions.writeln('typedef chan $typ.cname;') @@ -825,6 +822,14 @@ static inline void __${typ.cname}_pushval($typ.cname ch, $el_stype val) { } } } + + // Generating interfaces after all the common types have been defined + // to prevent generating interface struct before definition of field types + for typ in g.table.type_symbols { + if typ.kind == .interface_ && typ.name !in c.builtins { + g.write_interface_typesymbol_declaration(typ) + } + } } pub fn (mut g Gen) write_interface_typesymbol_declaration(sym ast.TypeSymbol) { diff --git a/vlib/v/tests/interface_fields_typearray_test.v b/vlib/v/tests/interface_fields_typearray_test.v new file mode 100644 index 0000000000..74deed07fa --- /dev/null +++ b/vlib/v/tests/interface_fields_typearray_test.v @@ -0,0 +1,7 @@ +struct Test {} + +interface Testing { + tests []Test +} + +fn test_field_typearray() {}