Skip to content

glib: annotate static inline functions with G_AVAILABLE-type macros

Simon Marchi requested to merge simark/glib:static-inline-available into master

The public functions exposed as static inlines currently don't have annotations to describe when they were introduced. This means that compiling this file:

#include <glib.h>

void foo (void)
{
  g_rec_mutex_locker_new (NULL);
}

with:

gcc -c test.c \
  -I/tmp/glib/include/glib-2.0 \
  -I/tmp/glib/lib/x86_64-linux-gnu/glib-2.0/include \
  -Werror \
  -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_28 \
  -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_28

will not produce any error message, despite using g_rec_mutex_locker_new, a function that was introduced after 2.28.

This patch adds some annotations to all the publicly exposed static inline functions I could find.

I could not use the existing G_AVAILABLE* macros, because they may expand to extern. This would then clash with the static keyword and produce:

../glib/gthread.h:397:1: error: multiple storage classes in declaration specifiers
  397 | static inline GRecMutexLocker *
      | ^~~~~~

So I opted for adding a new set of macros, GLIB_AVAILABLE_STATIC_INLINE_IN_2_XY.

With this patch applied, the example from above produces the expected warning:

test.c: In function ‘foo’:
test.c:5:3: error: ‘g_rec_mutex_locker_new’ is deprecated: Not available before 2.60 [-Werror=deprecated-declarations]
    5 |   g_rec_mutex_locker_new (NULL);
      |   ^~~~~~~~~~~~~~~~~~~~~~
In file included from /tmp/glib/include/glib-2.0/glib/gasyncqueue.h:32,
                 from /tmp/glib/include/glib-2.0/glib.h:32,
                 from test.c:1:
/tmp/glib/include/glib-2.0/glib/gthread.h:398:1: note: declared here
  398 | g_rec_mutex_locker_new (GRecMutex *rec_mutex)
      | ^~~~~~~~~~~~~~~~~~~~~~
Edited by Simon Marchi

Merge request reports