qapi: Permit alternates with just one branch
A union or alternate without branches makes no sense and doesn't work: it can't be instantiated. A union or alternate with just one branch works, but is degenerate. We accept the former, but reject the latter. Weird. docs/devel/qapi-code-gen.txt doesn't mention the difference. It claims an alternate definition is "is similar to a simple union type". Permit degenerate alternates to make them consistent with unions. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20190913201349.24332-10-armbru@redhat.com>
This commit is contained in:
parent
675b214bc6
commit
f03255362a
@ -920,11 +920,9 @@ def check_alternate(expr, info):
|
||||
members = expr['data']
|
||||
types_seen = {}
|
||||
|
||||
# Check every branch; require at least two branches
|
||||
if len(members) < 2:
|
||||
if len(members) == 0:
|
||||
raise QAPISemError(info,
|
||||
"Alternate '%s' should have at least two branches "
|
||||
"in 'data'" % name)
|
||||
"Alternate '%s' cannot have empty 'data'" % name)
|
||||
for (key, value) in members.items():
|
||||
check_name(info, "Member of alternate '%s'" % name, key)
|
||||
check_known_keys(info,
|
||||
|
@ -1 +1 @@
|
||||
tests/qapi-schema/alternate-empty.json:2: Alternate 'Alt' should have at least two branches in 'data'
|
||||
tests/qapi-schema/alternate-empty.json:2: Alternate 'Alt' cannot have empty 'data'
|
||||
|
@ -1,2 +1,2 @@
|
||||
# alternates must list at least two types to be useful
|
||||
{ 'alternate': 'Alt', 'data': { 'i': 'int' } }
|
||||
# alternates cannot be empty
|
||||
{ 'alternate': 'Alt', 'data': { } }
|
||||
|
@ -186,19 +186,21 @@
|
||||
|
||||
# test that we correctly compile downstream extensions, as well as munge
|
||||
# ticklish names
|
||||
# also test union and alternate with just one branch
|
||||
{ 'enum': '__org.qemu_x-Enum', 'data': [ '__org.qemu_x-value' ] }
|
||||
{ 'struct': '__org.qemu_x-Base',
|
||||
'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
|
||||
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
|
||||
'data': { '__org.qemu_x-member2': 'str', '*wchar-t': 'int' } }
|
||||
{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
|
||||
{ 'alternate': '__org.qemu_x-Alt1', 'data': { '__org.qemu_x-branch': 'str' } }
|
||||
{ 'struct': '__org.qemu_x-Struct2',
|
||||
'data': { 'array': ['__org.qemu_x-Union1'] } }
|
||||
{ 'union': '__org.qemu_x-Union2', 'base': '__org.qemu_x-Base',
|
||||
'discriminator': '__org.qemu_x-member1',
|
||||
'data': { '__org.qemu_x-value': '__org.qemu_x-Struct2' } }
|
||||
{ 'alternate': '__org.qemu_x-Alt',
|
||||
'data': { '__org.qemu_x-branch': 'str', 'b': '__org.qemu_x-Base' } }
|
||||
'data': { '__org.qemu_x-branch': '__org.qemu_x-Base' } }
|
||||
{ 'event': '__ORG.QEMU_X-EVENT', 'data': '__org.qemu_x-Struct' }
|
||||
{ 'command': '__org.qemu_x-command',
|
||||
'data': { 'a': ['__org.qemu_x-Enum'], 'b': ['__org.qemu_x-Struct'],
|
||||
|
@ -274,6 +274,9 @@ object __org.qemu_x-Union1
|
||||
member type: __org.qemu_x-Union1Kind optional=False
|
||||
tag type
|
||||
case __org.qemu_x-branch: q_obj_str-wrapper
|
||||
alternate __org.qemu_x-Alt1
|
||||
tag type
|
||||
case __org.qemu_x-branch: str
|
||||
array __org.qemu_x-Union1List __org.qemu_x-Union1
|
||||
object __org.qemu_x-Struct2
|
||||
member array: __org.qemu_x-Union1List optional=False
|
||||
@ -283,8 +286,7 @@ object __org.qemu_x-Union2
|
||||
case __org.qemu_x-value: __org.qemu_x-Struct2
|
||||
alternate __org.qemu_x-Alt
|
||||
tag type
|
||||
case __org.qemu_x-branch: str
|
||||
case b: __org.qemu_x-Base
|
||||
case __org.qemu_x-branch: __org.qemu_x-Base
|
||||
event __ORG.QEMU_X-EVENT __org.qemu_x-Struct
|
||||
boxed=False
|
||||
array __org.qemu_x-EnumList __org.qemu_x-Enum
|
||||
|
Loading…
Reference in New Issue
Block a user