[PATCH 2/2 v2] compat: add compatibility definitions for old MM_MODEM_BAND_EUTRAN_* values
Ben Chan
benchan at chromium.org
Wed Jun 28 14:08:03 UTC 2017
On Wed, Jun 28, 2017 at 1:46 AM, Aleksander Morgado
<aleksander at aleksander.es> wrote:
>
> On Wed, Jun 28, 2017 at 9:36 AM, Ben Chan <benchan at chromium.org> wrote:
> > When adding this compat header, I noticed that __attribute__((deprecated)),
> > which G_DEPRECATED_FOR is based on, can't be associated with macros. Both
> > gcc and clang associated the attribute to the next identifier found after
> > the macro definition, not the macro itself:
> >
> > #1
> > G_DEPRECATED_FOR(NEW_ENUM)
> > #define OLD_ENUM NEW_NUM
> > void foo() {} // __attribute__((deprecated)) is applied to foo()
> > instead of OLD_ENUM
> > foo(); // this triggers a deprecation warning
> >
> > #2
> > G_DEPRECATED_FOR(NEW_ENUM)
> > #define OLD_ENUM NEW_NUM
> > struct bar; // clang fails to apply __attribute__((deprecated)) here
> > and throws an ignored-attribute warning
> >
> > It seems like only MSVC supports deprecation attribute on macro definitions
> > via #pragma deprecated. Enumerator attribute would be the solution, but
> > only gcc 6 or above (clang 3 or above) supports that. For example, we can
> > use unnamed enum to define deprecated enumerators like this:
> >
> > enum {
> > OLD_ENUM G_DEPRECATED_FOR(NEW_ENUM) = NEW_ENUM
> > };
> >
> > Instead of relying on compiler support of enumerator attribute, I use a
> > `static const int` in this patch as a workaround:
> >
> > G_DEPRECATED_FOR(NEW_ENUM)
> > static const int OLD_ENUM = NEW_ENUM;
> >
> > We can eventually migrate to use enumerator attribute when that is widely
> > supported by the default toolchain. I also posted patches to fix the
> > G_DEPRECATED_FOR annotations in libqmi and libmbim.
>
> I just realized we lost documentation for the compat symbols when this
> new logic is introduced... See e.g. how the symbols were documented
> for libqmi:
> https://www.freedesktop.org/software/libqmi/libqmi-glib/latest/libqmi-glib-API-break-replacements.html
>
> If you rebuild with gtk-doc enabled, the new documentation doesn't
> show those any more. Maybe we need to add them explicitly in the
> sections file?
>
It seems to me that gtk-doc doesn't deal with `static const`
definitions. One silly workaround is to do something like this:
/**
* OLD_ENUM:
*
*/
G_DEPRECATED_FOR(NEW_ENUM)
static const int DEPRECATED_OLD_ENUM = NEW_ENUM;
#define OLD_ENUM DEPRECATED_OLD_ENUM
WDYT?
>
> --
> Aleksander
> https://aleksander.es
More information about the ModemManager-devel
mailing list