From: Eric Pouech epouech@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@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);