From: Eric Pouech <epouech(a)codeweavers.com> If interface I1 inherits from interface I2, midl allows I2 declaration to appear after I1's declaration in .idl file. Keeping the .idl order is fine with C binding, but doesn't work for C++ classes (class I2 must be declared before being inherited from). So ensure inherited interface is declared in header generation before using it. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- tools/widl/header.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/widl/header.c b/tools/widl/header.c index 55da9e0d3f8..a14d3113869 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -1986,6 +1986,13 @@ static void write_type(FILE *header, /*const */ type_t *type, bool is_defined) type_t *iface = type, *async_iface; if (type_get_type(type) == TYPE_DELEGATE) iface = type_delegate_get_iface(iface); + else /* TYPE_INTERFACE */ + { + if (iface->written) return; + if (iface->details.iface && iface->details.iface->inherit && + type_iface_get_inherit(iface->details.iface->inherit) /* skip IUnknown */) + write_type(header, type->details.iface->inherit, true); + } async_iface = type_iface_get_async_iface(iface); if (is_object(iface)) is_object_interface++; if (is_attr(type->attrs, ATTR_DISPINTERFACE) || is_object(type)) @@ -2006,6 +2013,7 @@ static void write_type(FILE *header, /*const */ type_t *type, bool is_defined) write_rpc_interface_end(header, iface); } if (is_object(iface)) is_object_interface--; + if (type_get_type(type) == TYPE_INTERFACE) type->written = true; } else if (type_get_type(type) == TYPE_COCLASS) write_coclass(header, type); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8500