[glib: 1/2] glib: annotate static inline functions with G_AVAILABLE-type macros



commit 50502987495ad55b5168e23b0c0283924881a8b3
Author: Simon Marchi <simon marchi efficios com>
Date:   Fri May 1 15:30:23 2020 -0400

    glib: annotate static inline functions with G_AVAILABLE-type macros
    
    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)
              | ^~~~~~~~~~~~~~~~~~~~~~

 docs/reference/glib/glib-sections.txt |  6 ++++++
 docs/reference/meson.build            |  4 +++-
 glib/gmacros.h                        |  1 +
 glib/gmain.h                          |  2 ++
 glib/gmem.h                           |  1 +
 glib/gthread.h                        |  8 ++++++++
 glib/gversionmacros.h                 | 10 ++++++++++
 7 files changed, 31 insertions(+), 1 deletion(-)
---
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index b1d78ccc3..6628d2322 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -207,6 +207,11 @@ GLIB_AVAILABLE_MACRO_IN_2_60
 GLIB_AVAILABLE_MACRO_IN_2_62
 GLIB_AVAILABLE_MACRO_IN_2_64
 GLIB_AVAILABLE_MACRO_IN_2_66
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_60
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_66
 GLIB_AVAILABLE_TYPE_IN_2_26
 GLIB_AVAILABLE_TYPE_IN_2_28
 GLIB_AVAILABLE_TYPE_IN_2_30
@@ -706,6 +711,7 @@ GLIB_DEPRECATED_FOR
 GLIB_UNAVAILABLE
 GLIB_UNAVAILABLE_ENUMERATOR
 GLIB_UNAVAILABLE_MACRO
+GLIB_UNAVAILABLE_STATIC_INLINE
 GLIB_UNAVAILABLE_TYPE
 G_ANALYZER_ANALYZING
 G_ANALYZER_NORETURN
diff --git a/docs/reference/meson.build b/docs/reference/meson.build
index 873aa6dc1..7c3e589ab 100644
--- a/docs/reference/meson.build
+++ b/docs/reference/meson.build
@@ -26,6 +26,8 @@ foreach version : stable_2_series_versions
     'GLIB_DEPRECATED_IN_2_' + version + '_FOR()',
     'GLIB_DEPRECATED_IN_2_' + version,
 
+    'GLIB_AVAILABLE_STATIC_INLINE_IN_2_' + version,
+
     'GLIB_AVAILABLE_ENUMERATOR_IN_2_' + version,
     'GLIB_DEPRECATED_ENUMERATOR_IN_2_' + version + '_FOR()',
     'GLIB_DEPRECATED_ENUMERATOR_IN_2_' + version,
@@ -57,4 +59,4 @@ endif
 
 subdir('gio')
 subdir('glib')
-subdir('gobject')
\ No newline at end of file
+subdir('gobject')
diff --git a/glib/gmacros.h b/glib/gmacros.h
index 45a7874ef..7210f0247 100644
--- a/glib/gmacros.h
+++ b/glib/gmacros.h
@@ -982,6 +982,7 @@
 #define GLIB_DEPRECATED G_DEPRECATED _GLIB_EXTERN
 #define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _GLIB_EXTERN
 #define GLIB_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _GLIB_EXTERN
+#define GLIB_UNAVAILABLE_STATIC_INLINE(maj,min) G_UNAVAILABLE(maj,min)
 #endif
 
 #if !defined(GLIB_DISABLE_DEPRECATION_WARNINGS) && \
diff --git a/glib/gmain.h b/glib/gmain.h
index d4776c19b..5c0e524cc 100644
--- a/glib/gmain.h
+++ b/glib/gmain.h
@@ -499,6 +499,7 @@ typedef void GMainContextPusher GLIB_AVAILABLE_TYPE_IN_2_64;
  * Since: 2.64
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
 static inline GMainContextPusher *
 g_main_context_pusher_new (GMainContext *main_context)
 {
@@ -520,6 +521,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
  * Since: 2.64
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
 static inline void
 g_main_context_pusher_free (GMainContextPusher *pusher)
 {
diff --git a/glib/gmem.h b/glib/gmem.h
index 953a0182d..45671073b 100644
--- a/glib/gmem.h
+++ b/glib/gmem.h
@@ -197,6 +197,7 @@ gpointer g_try_realloc_n  (gpointer  mem,
  *
  * Since: 2.44
  */
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
 static inline gpointer
 g_steal_pointer (gpointer pp)
 {
diff --git a/glib/gthread.h b/glib/gthread.h
index 980522bba..96f536916 100644
--- a/glib/gthread.h
+++ b/glib/gthread.h
@@ -317,6 +317,7 @@ typedef void GMutexLocker;
  * Returns: a #GMutexLocker
  * Since: 2.44
  */
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
 static inline GMutexLocker *
 g_mutex_locker_new (GMutex *mutex)
 {
@@ -334,6 +335,7 @@ g_mutex_locker_new (GMutex *mutex)
  *
  * Since: 2.44
  */
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
 static inline void
 g_mutex_locker_free (GMutexLocker *locker)
 {
@@ -391,6 +393,7 @@ typedef void GRecMutexLocker;
  * Since: 2.60
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_60
 static inline GRecMutexLocker *
 g_rec_mutex_locker_new (GRecMutex *rec_mutex)
 {
@@ -410,6 +413,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
  * Since: 2.60
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_60
 static inline void
 g_rec_mutex_locker_free (GRecMutexLocker *locker)
 {
@@ -499,6 +503,7 @@ typedef void GRWLockWriterLocker;
  * Since: 2.62
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
 static inline GRWLockWriterLocker *
 g_rw_lock_writer_locker_new (GRWLock *rw_lock)
 {
@@ -519,6 +524,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
  * Since: 2.62
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
 static inline void
 g_rw_lock_writer_locker_free (GRWLockWriterLocker *locker)
 {
@@ -552,6 +558,7 @@ typedef void GRWLockReaderLocker;
  * Since: 2.62
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
 static inline GRWLockReaderLocker *
 g_rw_lock_reader_locker_new (GRWLock *rw_lock)
 {
@@ -572,6 +579,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
  * Since: 2.62
  */
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
 static inline void
 g_rw_lock_reader_locker_free (GRWLockReaderLocker *locker)
 {
diff --git a/glib/gversionmacros.h b/glib/gversionmacros.h
index fd86ade02..08bf7d042 100644
--- a/glib/gversionmacros.h
+++ b/glib/gversionmacros.h
@@ -646,11 +646,13 @@
 
 #if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_44
 # define GLIB_AVAILABLE_IN_2_44                 GLIB_UNAVAILABLE(2, 44)
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_44   GLIB_UNAVAILABLE_STATIC_INLINE(2, 44)
 # define GLIB_AVAILABLE_MACRO_IN_2_44           GLIB_UNAVAILABLE_MACRO(2, 44)
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_44      GLIB_UNAVAILABLE_ENUMERATOR(2, 44)
 # define GLIB_AVAILABLE_TYPE_IN_2_44            GLIB_UNAVAILABLE_TYPE(2, 44)
 #else
 # define GLIB_AVAILABLE_IN_2_44                 _GLIB_EXTERN
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
 # define GLIB_AVAILABLE_MACRO_IN_2_44
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_44
 # define GLIB_AVAILABLE_TYPE_IN_2_44
@@ -898,11 +900,13 @@
 
 #if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_60
 # define GLIB_AVAILABLE_IN_2_60                 GLIB_UNAVAILABLE(2, 60)
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_60   GLIB_UNAVAILABLE_STATIC_INLINE(2, 60)
 # define GLIB_AVAILABLE_MACRO_IN_2_60           GLIB_UNAVAILABLE_MACRO(2, 60)
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_60      GLIB_UNAVAILABLE_ENUMERATOR(2, 60)
 # define GLIB_AVAILABLE_TYPE_IN_2_60            GLIB_UNAVAILABLE_TYPE(2, 60)
 #else
 # define GLIB_AVAILABLE_IN_2_60                 _GLIB_EXTERN
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_60
 # define GLIB_AVAILABLE_MACRO_IN_2_60
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_60
 # define GLIB_AVAILABLE_TYPE_IN_2_60
@@ -930,11 +934,13 @@
 
 #if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_62
 # define GLIB_AVAILABLE_IN_2_62                 GLIB_UNAVAILABLE(2, 62)
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_62   GLIB_UNAVAILABLE_STATIC_INLINE(2, 62)
 # define GLIB_AVAILABLE_MACRO_IN_2_62           GLIB_UNAVAILABLE_MACRO(2, 62)
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_62      GLIB_UNAVAILABLE_ENUMERATOR(2, 62)
 # define GLIB_AVAILABLE_TYPE_IN_2_62            GLIB_UNAVAILABLE_TYPE(2, 62)
 #else
 # define GLIB_AVAILABLE_IN_2_62                 _GLIB_EXTERN
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
 # define GLIB_AVAILABLE_MACRO_IN_2_62
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_62
 # define GLIB_AVAILABLE_TYPE_IN_2_62
@@ -962,11 +968,13 @@
 
 #if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_64
 # define GLIB_AVAILABLE_IN_2_64                 GLIB_UNAVAILABLE(2, 64)
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_64   GLIB_UNAVAILABLE_STATIC_INLINE(2, 64)
 # define GLIB_AVAILABLE_MACRO_IN_2_64           GLIB_UNAVAILABLE_MACRO(2, 64)
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_64      GLIB_UNAVAILABLE_ENUMERATOR(2, 64)
 # define GLIB_AVAILABLE_TYPE_IN_2_64            GLIB_UNAVAILABLE_TYPE(2, 64)
 #else
 # define GLIB_AVAILABLE_IN_2_64                 _GLIB_EXTERN
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
 # define GLIB_AVAILABLE_MACRO_IN_2_64
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_64
 # define GLIB_AVAILABLE_TYPE_IN_2_64
@@ -994,11 +1002,13 @@
 
 #if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_66
 # define GLIB_AVAILABLE_IN_2_66                 GLIB_UNAVAILABLE(2, 66)
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_66   GLIB_UNAVAILABLE_STATIC_INLINE(2, 66)
 # define GLIB_AVAILABLE_MACRO_IN_2_66           GLIB_UNAVAILABLE_MACRO(2, 66)
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_66      GLIB_UNAVAILABLE_ENUMERATOR(2, 66)
 # define GLIB_AVAILABLE_TYPE_IN_2_66            GLIB_UNAVAILABLE_TYPE(2, 66)
 #else
 # define GLIB_AVAILABLE_IN_2_66                 _GLIB_EXTERN
+# define GLIB_AVAILABLE_STATIC_INLINE_IN_2_66
 # define GLIB_AVAILABLE_MACRO_IN_2_66
 # define GLIB_AVAILABLE_ENUMERATOR_IN_2_66
 # define GLIB_AVAILABLE_TYPE_IN_2_66


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]