[PATCH 1/5] api: don't use intermediate variables for deprecation warnings
Ben Chan
benchan at chromium.org
Mon Aug 21 00:32:28 UTC 2017
On Sun, Aug 20, 2017 at 1:50 PM, Aleksander Morgado <
aleksander at aleksander.es> wrote:
> On Sun, Aug 20, 2017 at 7:09 PM, Ben Chan <benchan at chromium.org> wrote:
> >
> >
> > On Sun, Aug 20, 2017 at 9:37 AM, Aleksander Morgado
> > <aleksander at aleksander.es> wrote:
> >>
> >> Using an intermediate constant variable breaks compilation with C
> >> compilers, as these variables cannot be used as initializers.
> >>
> >
> > Aleksander, do you have the compiler version and the code snippet that
> > causes the compiler error?
> >
>
> Here's an example:
>
> /* test.c */
> #include <stdio.h>
> #include <ModemManager.h>
>
> typedef struct {
> MMModemBand band;
> char *str;
> } BandName;
>
> static const BandName names[] = {
> { .band = MM_MODEM_BAND_EUTRAN_XLII, "e-utran 43" },
> };
>
> int main(int argc, char **argv)
> {
> guint i;
>
> for (i = 0; i < G_N_ELEMENTS (names); i++)
> printf ("band '%s' has id %u\n", names[i].str, names[i].band);
> return 0;
> }
>
> Compilation fails with "error: initializer element is not constant":
> $ gcc -o test `pkg-config --cflags --libs ModemManager glib-2.0` test.c
> test.c:12:2: warning: ‘MM_DEPRECATED_MODEM_BAND_EUTRAN_XLII’ is
> deprecated: Use 'MM_MODEM_BAND_EUTRAN_42' instead
> [-Wdeprecated-declarations]
> { .band = MM_MODEM_BAND_EUTRAN_XLII, "e-utran 43" },
> ^
> In file included from /usr/include/ModemManager/ModemManager.h:41:0,
> from test.c:4:
> /usr/include/ModemManager/ModemManager-compat.h:441:18: note: declared
> here
> static const int MM_DEPRECATED_MODEM_BAND_EUTRAN_XLII =
> MM_MODEM_BAND_EUTRAN_42;
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /usr/include/ModemManager/ModemManager-compat.h:442:35: error:
> initializer element is not constant
> #define MM_MODEM_BAND_EUTRAN_XLII MM_DEPRECATED_MODEM_BAND_EUTRAN_XLII
> ^
> /usr/include/ModemManager/ModemManager-compat.h:442:35: note: in
> definition of macro ‘MM_MODEM_BAND_EUTRAN_XLII’
> #define MM_MODEM_BAND_EUTRAN_XLII MM_DEPRECATED_MODEM_BAND_EUTRAN_XLII
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /usr/include/ModemManager/ModemManager-compat.h:442:35: note: (near
> initialization for ‘names[0].band’)
> #define MM_MODEM_BAND_EUTRAN_XLII MM_DEPRECATED_MODEM_BAND_EUTRAN_XLII
> ^
> /usr/include/ModemManager/ModemManager-compat.h:442:35: note: in
> definition of macro ‘MM_MODEM_BAND_EUTRAN_XLII’
> #define MM_MODEM_BAND_EUTRAN_XLII MM_DEPRECATED_MODEM_BAND_EUTRAN_XLII
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> $ gcc --version
> gcc (GCC) 7.1.1 20170630
>
> For what I could gather browsing; using constant variables as
> initializers is valid C++, but not C. The approach I took for the
> patch is what the GTK+ did when deprecating GtkStock macros (e.g.
> https://github.com/GNOME/gtk/blob/7173df1dd1a8f45c47b75d30bfbfaa
> 67f33d8e9b/gtk/deprecated/gtkstock.h#L102)
>
lgtm.
Yeah, unfortunately, it seems like C has a different rule for constant
expressions (than C++). A simple expression like this fails to compile with
gcc (even in c99, c11), but succeeds with clang:
static const int a = 1;
static const int b = a; /* error: initializer element is not constant
*/
Seems a bit subtle that `static const int a = 1` isn't regarded as a
constant expression. It may be related to whether there is any guarantee on
the initialization order.
>
> --
> Aleksander
> https://aleksander.es
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/modemmanager-devel/attachments/20170820/cbf0a142/attachment.html>
More information about the ModemManager-devel
mailing list