From nobody Tue Feb 10 12:42:27 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1515708948881401.95051823825247; Thu, 11 Jan 2018 14:15:48 -0800 (PST) Received: from localhost ([::1]:46408 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZl8W-0008Pi-4Q for importer@patchew.org; Thu, 11 Jan 2018 17:15:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51319) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eZkW8-0007Hp-Ko for qemu-devel@nongnu.org; Thu, 11 Jan 2018 16:36:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eZkW6-0003w5-GN for qemu-devel@nongnu.org; Thu, 11 Jan 2018 16:36:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:33662) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eZkW6-0003uA-7V for qemu-devel@nongnu.org; Thu, 11 Jan 2018 16:36:06 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5CCDC4E8BD; Thu, 11 Jan 2018 21:36:05 +0000 (UTC) Received: from localhost (ovpn-112-44.ams2.redhat.com [10.36.112.44]) by smtp.corp.redhat.com (Postfix) with ESMTP id 38ED317982; Thu, 11 Jan 2018 21:36:01 +0000 (UTC) From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= To: qemu-devel@nongnu.org Date: Thu, 11 Jan 2018 22:32:27 +0100 Message-Id: <20180111213250.16511-29-marcandre.lureau@redhat.com> In-Reply-To: <20180111213250.16511-1-marcandre.lureau@redhat.com> References: <20180111213250.16511-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 11 Jan 2018 21:36:05 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v4 28/51] qapi: add an error in case a discriminator is conditionnal X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eduardo Habkost , armbru@redhat.com, Michael Roth , Cleber Rosa , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Making a discriminator conditonal doesn't make much sense. Instead, the union could be made conditional. Signed-off-by: Marc-Andr=C3=A9 Lureau --- scripts/qapi.py | 11 +++++++++-- tests/Makefile.include | 1 + .../qapi-schema/flat-union-invalid-if-discriminator.err | 1 + .../flat-union-invalid-if-discriminator.exit | 1 + .../flat-union-invalid-if-discriminator.json | 17 +++++++++++++= ++++ .../qapi-schema/flat-union-invalid-if-discriminator.out | 0 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/qapi-schema/flat-union-invalid-if-discriminator.e= rr create mode 100644 tests/qapi-schema/flat-union-invalid-if-discriminator.e= xit create mode 100644 tests/qapi-schema/flat-union-invalid-if-discriminator.j= son create mode 100644 tests/qapi-schema/flat-union-invalid-if-discriminator.o= ut diff --git a/scripts/qapi.py b/scripts/qapi.py index c4a2623864..0f6d5dd179 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -568,7 +568,8 @@ def find_alternate_member_qtype(qapi_type): =20 # Return the discriminator enum define if discriminator is specified as an # enum type, otherwise return None. -def discriminator_find_enum_define(expr): +def discriminator_find_enum_define(expr, info): + name =3D expr['union'] base =3D expr.get('base') discriminator =3D expr.get('discriminator') =20 @@ -583,6 +584,11 @@ def discriminator_find_enum_define(expr): if not discriminator_member: return None =20 + if discriminator_member.get('if'): + raise QAPISemError(info, 'The discriminator %s.%s for union %s ' + 'must not be conditional' % + (base, discriminator, name)) + return enum_types.get(discriminator_member['type']) =20 =20 @@ -1010,7 +1016,8 @@ def check_exprs(exprs): # Try again for hidden UnionKind enum for expr_elem in exprs: expr =3D expr_elem['expr'] - if 'union' in expr and not discriminator_find_enum_define(expr): + info =3D expr_elem['info'] + if 'union' in expr and not discriminator_find_enum_define(expr, in= fo): name =3D '%sKind' % expr['union'] elif 'alternate' in expr: name =3D '%sKind' % expr['alternate'] diff --git a/tests/Makefile.include b/tests/Makefile.include index afd2971147..3aec5b0874 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -479,6 +479,7 @@ qapi-schema +=3D flat-union-inline.json qapi-schema +=3D flat-union-int-branch.json qapi-schema +=3D flat-union-invalid-branch-key.json qapi-schema +=3D flat-union-invalid-discriminator.json +qapi-schema +=3D flat-union-invalid-if-discriminator.json qapi-schema +=3D flat-union-no-base.json qapi-schema +=3D flat-union-optional-discriminator.json qapi-schema +=3D flat-union-string-discriminator.json diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.err b/te= sts/qapi-schema/flat-union-invalid-if-discriminator.err new file mode 100644 index 0000000000..0c94c9860d --- /dev/null +++ b/tests/qapi-schema/flat-union-invalid-if-discriminator.err @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-invalid-if-discriminator.json:13: The discrim= inator TestBase.enum1 for union TestUnion must not be conditional diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.exit b/t= ests/qapi-schema/flat-union-invalid-if-discriminator.exit new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/qapi-schema/flat-union-invalid-if-discriminator.exit @@ -0,0 +1 @@ +1 diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.json b/t= ests/qapi-schema/flat-union-invalid-if-discriminator.json new file mode 100644 index 0000000000..618ec36396 --- /dev/null +++ b/tests/qapi-schema/flat-union-invalid-if-discriminator.json @@ -0,0 +1,17 @@ +{ 'enum': 'TestEnum', + 'data': [ 'value1', 'value2' ] } + +{ 'struct': 'TestBase', + 'data': { 'enum1': { 'type': 'TestEnum', 'if': 'FOO' } } } + +{ 'struct': 'TestTypeA', + 'data': { 'string': 'str' } } + +{ 'struct': 'TestTypeB', + 'data': { 'integer': 'int' } } + +{ 'union': 'TestUnion', + 'base': 'TestBase', + 'discriminator': 'enum1', + 'data': { 'value1': 'TestTypeA', + 'value2': 'TestTypeB' } } diff --git a/tests/qapi-schema/flat-union-invalid-if-discriminator.out b/te= sts/qapi-schema/flat-union-invalid-if-discriminator.out new file mode 100644 index 0000000000..e69de29bb2 --=20 2.16.0.rc1.1.gef27df75a1