* [PATCH 0/2] qapi: Simplify enum generation @ 2023-02-24 15:54 Philippe Mathieu-Daudé 2023-02-24 15:54 ` [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() Philippe Mathieu-Daudé 2023-02-24 15:54 ` [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() Philippe Mathieu-Daudé 0 siblings, 2 replies; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-24 15:54 UTC (permalink / raw) To: qemu-devel Cc: Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster, Juan Quintela, Philippe Mathieu-Daudé QAPI generating enum count as part of the enum forces handling impossible switch cases. Modify qapi/types.py to generate the enum count as a definition. Do not try to cover the unreachable 'default' case. Clean files covering unreachable foo__MAX case. Philippe Mathieu-Daudé (2): qapi: Do not generate default switch case in gen_visit_object_members() qapi: Generate enum count as definition in gen_enum_lookup() audio/audio.c | 6 ------ audio/audio_template.h | 3 --- migration/migration.c | 2 -- replay/replay-input.c | 12 ------------ scripts/qapi/types.py | 11 +++++++---- scripts/qapi/visit.py | 2 -- softmmu/tpm-hmp-cmds.c | 2 -- ui/input-linux.c | 4 ---- ui/input.c | 6 ------ 9 files changed, 7 insertions(+), 41 deletions(-) -- 2.38.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() 2023-02-24 15:54 [PATCH 0/2] qapi: Simplify enum generation Philippe Mathieu-Daudé @ 2023-02-24 15:54 ` Philippe Mathieu-Daudé 2023-02-27 12:40 ` Juan Quintela 2023-02-27 13:14 ` Markus Armbruster 2023-02-24 15:54 ` [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() Philippe Mathieu-Daudé 1 sibling, 2 replies; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-24 15:54 UTC (permalink / raw) To: qemu-devel Cc: Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster, Juan Quintela, Philippe Mathieu-Daudé When iterating over a QAPISchemaEnumType, all possible values are covered. The 'default' switch case is unreachable, remove it. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- scripts/qapi/visit.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index 26a584ee4c..f66a31a963 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -159,8 +159,6 @@ def gen_visit_object_members(name: str, ret += var.ifcond.gen_endif() ret += mcgen(''' - default: - abort(); } ''') -- 2.38.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() 2023-02-24 15:54 ` [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() Philippe Mathieu-Daudé @ 2023-02-27 12:40 ` Juan Quintela 2023-02-27 13:14 ` Markus Armbruster 1 sibling, 0 replies; 9+ messages in thread From: Juan Quintela @ 2023-02-27 12:40 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > When iterating over a QAPISchemaEnumType, all possible > values are covered. The 'default' switch case is unreachable, > remove it. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Juan Quintela <quintela@redhat.com> Althought my qapi is rusty. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() 2023-02-24 15:54 ` [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() Philippe Mathieu-Daudé 2023-02-27 12:40 ` Juan Quintela @ 2023-02-27 13:14 ` Markus Armbruster 1 sibling, 0 replies; 9+ messages in thread From: Markus Armbruster @ 2023-02-27 13:14 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster, Juan Quintela Philippe Mathieu-Daudé <philmd@linaro.org> writes: > When iterating over a QAPISchemaEnumType, all possible > values are covered. The 'default' switch case is unreachable, > remove it. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > scripts/qapi/visit.py | 2 -- > 1 file changed, 2 deletions(-) > > diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py > index 26a584ee4c..f66a31a963 100644 > --- a/scripts/qapi/visit.py > +++ b/scripts/qapi/visit.py > @@ -159,8 +159,6 @@ def gen_visit_object_members(name: str, > > ret += var.ifcond.gen_endif() > ret += mcgen(''' > - default: > - abort(); > } > ''') This results in a bunch of warnings like warning: enumeration value ‘FOO__MAX’ not handled in switch [-Wswitch] Obvious fix: squash into the next patch. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() 2023-02-24 15:54 [PATCH 0/2] qapi: Simplify enum generation Philippe Mathieu-Daudé 2023-02-24 15:54 ` [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() Philippe Mathieu-Daudé @ 2023-02-24 15:54 ` Philippe Mathieu-Daudé 2023-02-24 21:16 ` Richard Henderson ` (2 more replies) 1 sibling, 3 replies; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2023-02-24 15:54 UTC (permalink / raw) To: qemu-devel Cc: Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster, Juan Quintela, Philippe Mathieu-Daudé QAPI's gen_enum() generates QAPI enum values and the number of this values (as foo__MAX). The number of entries in an enum type is not part of the enumerated values, but we generate it as such. See for example: typedef enum OnOffAuto { ON_OFF_AUTO_AUTO, ON_OFF_AUTO_ON, ON_OFF_AUTO_OFF, ON_OFF_AUTO__MAX, <--------- } OnOffAuto; Instead of declaring the enum count as the last enumerated value, #define it, so it is not part of the enum. The previous example becomes: typedef enum OnOffAuto { ON_OFF_AUTO_AUTO, ON_OFF_AUTO_ON, ON_OFF_AUTO_OFF, #define ON_OFF_AUTO__MAX 3 <--------- } OnOffAuto; Since Clang enables the -Wswitch warning by default [*], remove all pointless foo__MAX cases in switch statement, in order to avoid: audio/audio.c:2231:10: error: case value not in enumerated type 'AudioFormat' (aka 'enum AudioFormat') [-Wswitch] case AUDIO_FORMAT__MAX: ^ ui/input.c:233:14: error: case value not in enumerated type 'KeyValueKind' (aka 'enum KeyValueKind') [-Wswitch] case KEY_VALUE_KIND__MAX: ^ ... [*] https://clang.llvm.org/docs/DiagnosticsReference.html#wswitch Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- audio/audio.c | 6 ------ audio/audio_template.h | 3 --- migration/migration.c | 2 -- replay/replay-input.c | 12 ------------ scripts/qapi/types.py | 11 +++++++---- softmmu/tpm-hmp-cmds.c | 2 -- ui/input-linux.c | 4 ---- ui/input.c | 6 ------ 8 files changed, 7 insertions(+), 39 deletions(-) diff --git a/audio/audio.c b/audio/audio.c index 4290309d18..57130c44f6 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -2079,9 +2079,6 @@ void audio_create_pdos(Audiodev *dev) CASE(SPICE, spice, ); #endif CASE(WAV, wav, ); - - case AUDIODEV_DRIVER__MAX: - abort(); }; } @@ -2227,9 +2224,6 @@ int audioformat_bytes_per_sample(AudioFormat fmt) case AUDIO_FORMAT_S32: case AUDIO_FORMAT_F32: return 4; - - case AUDIO_FORMAT__MAX: - ; } abort(); } diff --git a/audio/audio_template.h b/audio/audio_template.h index 42b4712acb..58e1255d7a 100644 --- a/audio/audio_template.h +++ b/audio/audio_template.h @@ -369,9 +369,6 @@ AudiodevPerDirectionOptions *glue(audio_get_pdo_, TYPE)(Audiodev *dev) #endif case AUDIODEV_DRIVER_WAV: return dev->u.wav.TYPE; - - case AUDIODEV_DRIVER__MAX: - break; } abort(); } diff --git a/migration/migration.c b/migration/migration.c index ae2025d9d8..bdadab3b5e 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2220,8 +2220,6 @@ bool migration_is_idle(void) case MIGRATION_STATUS_DEVICE: case MIGRATION_STATUS_WAIT_UNPLUG: return false; - case MIGRATION_STATUS__MAX: - g_assert_not_reached(); } return false; diff --git a/replay/replay-input.c b/replay/replay-input.c index 1147e3d34e..c6de8e33ac 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -38,9 +38,6 @@ void replay_save_input_event(InputEvent *evt) replay_put_dword(key->key->u.qcode.data); replay_put_byte(key->down); break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; } break; case INPUT_EVENT_KIND_BTN: @@ -58,9 +55,6 @@ void replay_save_input_event(InputEvent *evt) replay_put_dword(move->axis); replay_put_qword(move->value); break; - case INPUT_EVENT_KIND__MAX: - /* keep gcc happy */ - break; } } @@ -89,9 +83,6 @@ InputEvent *replay_read_input_event(void) evt.u.key.data->key->u.qcode.data = (QKeyCode)replay_get_dword(); evt.u.key.data->down = replay_get_byte(); break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; } break; case INPUT_EVENT_KIND_BTN: @@ -109,9 +100,6 @@ InputEvent *replay_read_input_event(void) evt.u.abs.data->axis = (InputAxis)replay_get_dword(); evt.u.abs.data->value = replay_get_qword(); break; - case INPUT_EVENT_KIND__MAX: - /* keep gcc happy */ - break; } return QAPI_CLONE(InputEvent, &evt); diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py index c39d054d2c..b24bcb40ad 100644 --- a/scripts/qapi/types.py +++ b/scripts/qapi/types.py @@ -86,16 +86,13 @@ def gen_enum_lookup(name: str, def gen_enum(name: str, members: List[QAPISchemaEnumMember], prefix: Optional[str] = None) -> str: - # append automatically generated _MAX value - enum_members = members + [QAPISchemaEnumMember('_MAX', None)] - ret = mcgen(''' typedef enum %(c_name)s { ''', c_name=c_name(name)) - for memb in enum_members: + for memb in members: ret += memb.ifcond.gen_if() ret += mcgen(''' %(c_enum)s, @@ -103,6 +100,12 @@ def gen_enum(name: str, c_enum=c_enum_const(name, memb.name, prefix)) ret += memb.ifcond.gen_endif() + ret += mcgen(''' +#define %(c_name)s %(c_length)s +''', + c_name=c_enum_const(name, '_MAX', prefix), + c_length=len(members)) + ret += mcgen(''' } %(c_name)s; ''', diff --git a/softmmu/tpm-hmp-cmds.c b/softmmu/tpm-hmp-cmds.c index 9ed6ad6c4d..5a354cf6ac 100644 --- a/softmmu/tpm-hmp-cmds.c +++ b/softmmu/tpm-hmp-cmds.c @@ -52,8 +52,6 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict) teo = ti->options->u.emulator.data; monitor_printf(mon, ",chardev=%s", teo->chardev); break; - case TPM_TYPE__MAX: - break; } monitor_printf(mon, "\n"); c++; diff --git a/ui/input-linux.c b/ui/input-linux.c index e572a2e905..a6e7574422 100644 --- a/ui/input-linux.c +++ b/ui/input-linux.c @@ -120,10 +120,6 @@ static bool input_linux_check_toggle(InputLinux *il) return (il->keydown[KEY_LEFTCTRL] || il->keydown[KEY_RIGHTCTRL]) && il->keydown[KEY_SCROLLLOCK]; - - case GRAB_TOGGLE_KEYS__MAX: - /* avoid gcc error */ - break; } return false; } diff --git a/ui/input.c b/ui/input.c index f2d1e7a3a7..ca8f49a403 100644 --- a/ui/input.c +++ b/ui/input.c @@ -230,9 +230,6 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt) name = QKeyCode_str(key->key->u.qcode.data); trace_input_event_key_qcode(idx, name, key->down); break; - case KEY_VALUE_KIND__MAX: - /* keep gcc happy */ - break; } break; case INPUT_EVENT_KIND_BTN: @@ -250,9 +247,6 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt) name = InputAxis_str(move->axis); trace_input_event_abs(idx, name, move->value); break; - case INPUT_EVENT_KIND__MAX: - /* keep gcc happy */ - break; } } -- 2.38.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() 2023-02-24 15:54 ` [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() Philippe Mathieu-Daudé @ 2023-02-24 21:16 ` Richard Henderson 2023-02-27 12:41 ` Juan Quintela 2023-02-27 13:10 ` Markus Armbruster 2 siblings, 0 replies; 9+ messages in thread From: Richard Henderson @ 2023-02-24 21:16 UTC (permalink / raw) To: Philippe Mathieu-Daudé, qemu-devel Cc: Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster, Juan Quintela On 2/24/23 05:54, Philippe Mathieu-Daudé wrote: > QAPI's gen_enum() generates QAPI enum values and the number > of this values (as foo__MAX). > The number of entries in an enum type is not part of the > enumerated values, but we generate it as such. See for > example: > > typedef enum OnOffAuto { > ON_OFF_AUTO_AUTO, > ON_OFF_AUTO_ON, > ON_OFF_AUTO_OFF, > ON_OFF_AUTO__MAX, <--------- > } OnOffAuto; > > Instead of declaring the enum count as the last enumerated > value, #define it, so it is not part of the enum. The previous > example becomes: > > typedef enum OnOffAuto { > ON_OFF_AUTO_AUTO, > ON_OFF_AUTO_ON, > ON_OFF_AUTO_OFF, > #define ON_OFF_AUTO__MAX 3 <--------- > } OnOffAuto; > > Since Clang enables the -Wswitch warning by default [*], remove all > pointless foo__MAX cases in switch statement, in order to avoid: > > audio/audio.c:2231:10: error: case value not in enumerated type 'AudioFormat' (aka 'enum AudioFormat') [-Wswitch] > case AUDIO_FORMAT__MAX: > ^ > ui/input.c:233:14: error: case value not in enumerated type 'KeyValueKind' (aka 'enum KeyValueKind') [-Wswitch] > case KEY_VALUE_KIND__MAX: > ^ > ... > > [*]https://clang.llvm.org/docs/DiagnosticsReference.html#wswitch > Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org> > --- Yay! Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() 2023-02-24 15:54 ` [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() Philippe Mathieu-Daudé 2023-02-24 21:16 ` Richard Henderson @ 2023-02-27 12:41 ` Juan Quintela 2023-02-27 13:10 ` Markus Armbruster 2 siblings, 0 replies; 9+ messages in thread From: Juan Quintela @ 2023-02-27 12:41 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Markus Armbruster Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > QAPI's gen_enum() generates QAPI enum values and the number > of this values (as foo__MAX). > The number of entries in an enum type is not part of the > enumerated values, but we generate it as such. See for > example: > > typedef enum OnOffAuto { > ON_OFF_AUTO_AUTO, > ON_OFF_AUTO_ON, > ON_OFF_AUTO_OFF, > ON_OFF_AUTO__MAX, <--------- > } OnOffAuto; > > Instead of declaring the enum count as the last enumerated > value, #define it, so it is not part of the enum. The previous > example becomes: > > typedef enum OnOffAuto { > ON_OFF_AUTO_AUTO, > ON_OFF_AUTO_ON, > ON_OFF_AUTO_OFF, > #define ON_OFF_AUTO__MAX 3 <--------- > } OnOffAuto; > > Since Clang enables the -Wswitch warning by default [*], remove all > pointless foo__MAX cases in switch statement, in order to avoid: > > audio/audio.c:2231:10: error: case value not in enumerated type 'AudioFormat' (aka 'enum AudioFormat') [-Wswitch] > case AUDIO_FORMAT__MAX: > ^ > ui/input.c:233:14: error: case value not in enumerated type 'KeyValueKind' (aka 'enum KeyValueKind') [-Wswitch] > case KEY_VALUE_KIND__MAX: > ^ > ... > > [*] https://clang.llvm.org/docs/DiagnosticsReference.html#wswitch > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Juan Quintela <quintela@redhat.com> This other is very nice. Thanks, Juan. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() 2023-02-24 15:54 ` [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() Philippe Mathieu-Daudé 2023-02-24 21:16 ` Richard Henderson 2023-02-27 12:41 ` Juan Quintela @ 2023-02-27 13:10 ` Markus Armbruster 2023-03-15 10:32 ` Philippe Mathieu-Daudé 2 siblings, 1 reply; 9+ messages in thread From: Markus Armbruster @ 2023-02-27 13:10 UTC (permalink / raw) To: Philippe Mathieu-Daudé Cc: qemu-devel, Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Juan Quintela Philippe Mathieu-Daudé <philmd@linaro.org> writes: > QAPI's gen_enum() generates QAPI enum values and the number > of this values (as foo__MAX). > The number of entries in an enum type is not part of the > enumerated values, but we generate it as such. See for > example: > > typedef enum OnOffAuto { > ON_OFF_AUTO_AUTO, > ON_OFF_AUTO_ON, > ON_OFF_AUTO_OFF, > ON_OFF_AUTO__MAX, <--------- > } OnOffAuto; > > Instead of declaring the enum count as the last enumerated > value, #define it, so it is not part of the enum. The previous > example becomes: > > typedef enum OnOffAuto { > ON_OFF_AUTO_AUTO, > ON_OFF_AUTO_ON, > ON_OFF_AUTO_OFF, > #define ON_OFF_AUTO__MAX 3 <--------- > } OnOffAuto; I'm in favour. In fact, I've wanted to do this for a while, just never got around to it. > Since Clang enables the -Wswitch warning by default [*], remove all > pointless foo__MAX cases in switch statement, in order to avoid: > > audio/audio.c:2231:10: error: case value not in enumerated type 'AudioFormat' (aka 'enum AudioFormat') [-Wswitch] > case AUDIO_FORMAT__MAX: > ^ > ui/input.c:233:14: error: case value not in enumerated type 'KeyValueKind' (aka 'enum KeyValueKind') [-Wswitch] > case KEY_VALUE_KIND__MAX: > ^ > ... > > [*] https://clang.llvm.org/docs/DiagnosticsReference.html#wswitch > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Falls apart when the enum is empty: gcc -m64 -mcx16 -Iqga/qemu-ga.p -Iqga -I../qga -I. -Iqapi -Itrace -Iui -Iui/shader -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/sysprof-4 -fdiagnostics-color=auto -Wall -Winvalid-pch -std=gnu11 -O0 -g -isystem /work/armbru/qemu/linux-headers -isystem linux-headers -iquote . -iquote /work/armbru/qemu -iquote /work/armbru/qemu/include -iquote /work/armbru/qemu/tcg/i386 -pthread -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fno-common -fwrapv -Wundef -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2 -Wmissing-format-attribute -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong -fPIE -MD -MQ qga/qemu-ga.p/meson-generated_.._qga-qapi-emit-events.c.o -MF qga/qemu-ga.p/meson-generated_.._qga-qapi-emit-events.c.o.d -o qga/qemu-ga.p/meson-generated_.._qga-qapi-emit-events.c.o -c qga/qga-qapi-emit-events.c In file included from qga/qga-qapi-emit-events.c:14: qga/qga-qapi-emit-events.h:20:1: error: empty enum is invalid 20 | } qga_QAPIEvent; | ^ qga/qapi-schema.json does not define any events, so its (implicitly defined) event enumeration comes out empty. We could detect this, and either emit a dummy event, or suppress code generation for events entirely. Explicitly defined enumerations may also be empty. qapi-code-gen.rst says: Nothing prevents an empty enumeration, although it is probably not useful. We could forbid empty enumerations. Speaking of qapi-code-gen.rst: it also needs an update. Search for __MAX. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() 2023-02-27 13:10 ` Markus Armbruster @ 2023-03-15 10:32 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 9+ messages in thread From: Philippe Mathieu-Daudé @ 2023-03-15 10:32 UTC (permalink / raw) To: Markus Armbruster Cc: qemu-devel, Pavel Dovgalyuk, Paolo Bonzini, Michael Roth, Dr. David Alan Gilbert, Stefan Berger, Gerd Hoffmann, Juan Quintela, Eric Blake, Richard Henderson On 27/2/23 14:10, Markus Armbruster wrote: > Philippe Mathieu-Daudé <philmd@linaro.org> writes: > >> QAPI's gen_enum() generates QAPI enum values and the number >> of this values (as foo__MAX). >> The number of entries in an enum type is not part of the >> enumerated values, but we generate it as such. See for >> example: >> >> typedef enum OnOffAuto { >> ON_OFF_AUTO_AUTO, >> ON_OFF_AUTO_ON, >> ON_OFF_AUTO_OFF, >> ON_OFF_AUTO__MAX, <--------- >> } OnOffAuto; >> >> Instead of declaring the enum count as the last enumerated >> value, #define it, so it is not part of the enum. The previous >> example becomes: >> >> typedef enum OnOffAuto { >> ON_OFF_AUTO_AUTO, >> ON_OFF_AUTO_ON, >> ON_OFF_AUTO_OFF, >> #define ON_OFF_AUTO__MAX 3 <--------- >> } OnOffAuto; > > I'm in favour. In fact, I've wanted to do this for a while, just never > got around to it. > >> Since Clang enables the -Wswitch warning by default [*], remove all >> pointless foo__MAX cases in switch statement, in order to avoid: >> >> audio/audio.c:2231:10: error: case value not in enumerated type 'AudioFormat' (aka 'enum AudioFormat') [-Wswitch] >> case AUDIO_FORMAT__MAX: >> ^ >> ui/input.c:233:14: error: case value not in enumerated type 'KeyValueKind' (aka 'enum KeyValueKind') [-Wswitch] >> case KEY_VALUE_KIND__MAX: >> ^ >> ... >> >> [*] https://clang.llvm.org/docs/DiagnosticsReference.html#wswitch >> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > > Falls apart when the enum is empty: > > gcc -m64 -mcx16 -Iqga/qemu-ga.p -Iqga -I../qga -I. -Iqapi -Itrace -Iui -Iui/shader -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/sysprof-4 -fdiagnostics-color=auto -Wall -Winvalid-pch -std=gnu11 -O0 -g -isystem /work/armbru/qemu/linux-headers -isystem linux-headers -iquote . -iquote /work/armbru/qemu -iquote /work/armbru/qemu/include -iquote /work/armbru/qemu/tcg/i386 -pthread -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fno-common -fwrapv -Wundef -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2 -Wmissing-format-attribute -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong -fPIE -MD -MQ qga/qemu-ga.p/meson-generated_.._qga-qapi-emit-events.c.o -MF qga/qemu-ga.p/meson-generated_.._qga-qapi-emit-events.c.o.d -o qga/qemu-ga.p/meson-generated_.._qga-qapi-emit-events.c.o -c qga/qga-qapi-emit-events.c > In file included from qga/qga-qapi-emit-events.c:14: > qga/qga-qapi-emit-events.h:20:1: error: empty enum is invalid > 20 | } qga_QAPIEvent; > | ^ While I could find that in the C++ standard, I couldn't in the C one. I wonder if in that case QAPI should generate foo__MAX = 0. No code / structure should use an enum type which doesn't contain any member... ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-03-15 10:33 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-02-24 15:54 [PATCH 0/2] qapi: Simplify enum generation Philippe Mathieu-Daudé 2023-02-24 15:54 ` [PATCH 1/2] qapi: Do not generate default switch case in gen_visit_object_members() Philippe Mathieu-Daudé 2023-02-27 12:40 ` Juan Quintela 2023-02-27 13:14 ` Markus Armbruster 2023-02-24 15:54 ` [PATCH 2/2] qapi: Generate enum count as definition in gen_enum_lookup() Philippe Mathieu-Daudé 2023-02-24 21:16 ` Richard Henderson 2023-02-27 12:41 ` Juan Quintela 2023-02-27 13:10 ` Markus Armbruster 2023-03-15 10:32 ` Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).