Max Reitz <mre...@redhat.com> writes:

> Optional discriminators are fine, as long as there is a default value.
>
> Signed-off-by: Max Reitz <mre...@redhat.com>
> ---
>  scripts/qapi/common.py | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
> index 8c57d0c67a..203623795b 100644
> --- a/scripts/qapi/common.py
> +++ b/scripts/qapi/common.py
> @@ -1052,11 +1052,21 @@ def check_union(expr, info):
>          base_members = find_base_members(base)
>          assert base_members is not None
>  
> -        # The value of member 'discriminator' must name a non-optional
> -        # member of the base struct.
> +        # The value of member 'discriminator' must name a member of
> +        # the base struct.  (Optional members are allowed, but the
> +        # discriminator name must not start with '*', so keep
> +        # allow_optional=False.)
>          check_name(info, "Discriminator of flat union '%s'" % name,
>                     discriminator)
> +
>          discriminator_value = base_members.get(discriminator)
> +        if not discriminator_value:
> +            discriminator_value = base_members.get('*' + discriminator)
> +            if discriminator_value and 'default' not in discriminator_value:
> +                raise QAPISemError(info,
> +                    "Optional discriminator '%s' has no default value" %
> +                    discriminator)
> +
>          if not discriminator_value:
>              raise QAPISemError(info,
>                                 "Discriminator '%s' is not a member of base "

Needs test coverage and doc update.

Oh, looks like later patches provide.  Please consider squashing.  Doc
updates and tests often make code changes easier to understand.


Reply via email to