qapi: Avoid assertion failure on union 'type' collision
commitede42e8e7e9c8e55a6240e8dd138331f6b4de33a
authorEric Blake <eblake@redhat.com>
Tue, 29 Sep 2015 22:21:04 +0000 (29 16:21 -0600)
committerMarkus Armbruster <armbru@redhat.com>
Thu, 1 Oct 2015 17:10:40 +0000 (1 19:10 +0200)
treeb71b35294e14a29cdd4a23408c6bc4eb40658ca7
parent530d0c4298f5ec873dddb5cc08acb0f6f4295d3d
qapi: Avoid assertion failure on union 'type' collision

The previous commit added two tests that triggered an assertion
failure. It's fairly straightforward to avoid the failure by
just outright forbidding the collision between a union's tag
values and its discriminator name (including the implicit name
'kind' supplied for simple unions [*]).  Ultimately, we'd like
to move the collision detection into QAPISchema*.check(), but
for now it is easier just to enhance the existing checks.

[*] Of course, down the road, we have plans to rename the simple
union tag name to 'type' to match the QMP wire name, but the
idea of the collision will still be present even then.

Technically, we could avoid the collision by naming the C union
members representing each enum value as '_case_value' rather
than 'value'; but until we have an actual qapi client (and not
just our testsuite) that has a legitimate reason to match a
case label to the name of a QMP key and needs the name munging
to satisfy the compiler, it's easier to just reject the qapi
as invalid.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1443565276-4535-7-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
scripts/qapi.py
tests/qapi-schema/flat-union-clash-type.err
tests/qapi-schema/flat-union-clash-type.json
tests/qapi-schema/union-clash-type.err
tests/qapi-schema/union-clash-type.json