Optional discriminators are fine, as long as there is a default value.
Signed-off-by: Max Reitz <[email protected]>
---
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 "
--
2.21.0