Attempt to serialize enum that contain more than one key mapped to certain value leads to corrupted C code
Submitted by Marcin Lewandowski
Link to original bug (#702207)
Description
In my code I use @"$(x)" syntax to output variable of type GstPadProbeType.
Generated C code does not compile. GCC returns:
myfile.c: In function ‘_gst_pad_probe_type_to_string’:
myfile.c:1410:3: error: duplicate case value
myfile.c:1394:3: error: previously used here
Indeed, when I take a look on generated code it looks like this:
static const char* _gst_pad_probe_type_to_string (GstPadProbeType value) {
switch (value) {
case GST_PAD_PROBE_TYPE_INVALID:
return "GST_PAD_PROBE_TYPE_INVALID";
case GST_PAD_PROBE_TYPE_IDLE:
return "GST_PAD_PROBE_TYPE_IDLE";
case GST_PAD_PROBE_TYPE_BLOCK:
return "GST_PAD_PROBE_TYPE_BLOCK";
case GST_PAD_PROBE_TYPE_BUFFER:
return "GST_PAD_PROBE_TYPE_BUFFER";
case GST_PAD_PROBE_TYPE_BUFFER_LIST:
return "GST_PAD_PROBE_TYPE_BUFFER_LIST";
case GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM:
return "GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM";
case GST_PAD_PROBE_TYPE_EVENT_UPSTREAM:
return "GST_PAD_PROBE_TYPE_EVENT_UPSTREAM";
case GST_PAD_PROBE_TYPE_EVENT_FLUSH:
return "GST_PAD_PROBE_TYPE_EVENT_FLUSH";
case GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM:
return "GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM";
case GST_PAD_PROBE_TYPE_QUERY_UPSTREAM:
return "GST_PAD_PROBE_TYPE_QUERY_UPSTREAM";
case GST_PAD_PROBE_TYPE_PUSH:
return "GST_PAD_PROBE_TYPE_PUSH";
case GST_PAD_PROBE_TYPE_PULL:
return "GST_PAD_PROBE_TYPE_PULL";
case GST_PAD_PROBE_TYPE_BLOCKING:
return "GST_PAD_PROBE_TYPE_BLOCKING";
case GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM:
return "GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM";
case GST_PAD_PROBE_TYPE_DATA_UPSTREAM:
return "GST_PAD_PROBE_TYPE_DATA_UPSTREAM";
case GST_PAD_PROBE_TYPE_DATA_BOTH:
return "GST_PAD_PROBE_TYPE_DATA_BOTH";
case GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM:
return "GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM";
case GST_PAD_PROBE_TYPE_BLOCK_UPSTREAM:
return "GST_PAD_PROBE_TYPE_BLOCK_UPSTREAM";
case GST_PAD_PROBE_TYPE_EVENT_BOTH:
return "GST_PAD_PROBE_TYPE_EVENT_BOTH";
case GST_PAD_PROBE_TYPE_QUERY_BOTH:
return "GST_PAD_PROBE_TYPE_QUERY_BOTH";
case GST_PAD_PROBE_TYPE_ALL_BOTH:
return "GST_PAD_PROBE_TYPE_ALL_BOTH";
case GST_PAD_PROBE_TYPE_SCHEDULING:
return "GST_PAD_PROBE_TYPE_SCHEDULING";
}
return NULL;
}
Lines 1410 and 1394 are GST_PAD_PROBE_TYPE_DATA_UPSTREAM & GST_PAD_PROBE_TYPE_EVENT_UPSTREAM, respectively.
While I understand that it is due to kind of strange assignment
GST_PAD_PROBE_TYPE_DATA_UPSTREAM = GST_PAD_PROBE_TYPE_EVENT_UPSTREAM,
in GStreamer itself (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-remove-probe), such cases are perfectly legal and vala compiler should handle them gracefully.
Version: 0.20.x
Edited by Rico Tzschichholz