NetworkManager/shared/nm-glib-aux
Thomas Haller 925a688400 shared/glib: reimplement g_atomic_pointer_compare_and_exchange() macro
With glib 2.63.2 and clang 9.0.0 (Fedora 32) we get compile errors:

  ../clients/cloud-setup/nmcs-provider-ec2.c:51:8: error: incompatible pointer types passing 'typeof ((((void *)0))) *' (aka 'void **') to parameter of type 'const char **' [-Werror,-Wincompatible-pointer-types]
                  if (!g_atomic_pointer_compare_and_exchange (&base_cached, NULL, base))
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/glib-2.0/glib/gatomic.h:192:44: note: expanded from macro 'g_atomic_pointer_compare_and_exchange'
      __atomic_compare_exchange_n ((atomic), &gapcae_oldval, (newval), FALSE, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) ? TRUE : FALSE; \
                                             ^~~~~~~~~~~~~~
  ../src/devices/bluetooth/nm-bluez-manager.c:2836:2: error: incompatible pointer types passing 'typeof ((((void *)0))) *' (aka 'void **') to parameter of type 'const NMBtVTableNetworkServer **' (aka 'const struct _NMBtVTableNetworkServer **') [-Werror,-Wincompatible-pointer-types]
          g_atomic_pointer_compare_and_exchange (&nm_bt_vtable_network_server, NULL, &priv->vtable_network_server);
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/glib-2.0/glib/gatomic.h:192:44: note: expanded from macro 'g_atomic_pointer_compare_and_exchange'
      __atomic_compare_exchange_n ((atomic), &gapcae_oldval, (newval), FALSE, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) ? TRUE : FALSE; \
                                             ^~~~~~~~~~~~~~
  ../src/devices/bluetooth/nm-bluez-manager.c:2853:2: error: passing 'typeof ((&priv->vtable_network_server)) *' (aka 'struct _NMBtVTableNetworkServer **') to parameter of type 'const NMBtVTableNetworkServer **' (aka 'const struct _NMBtVTableNetworkServer **') discards qualifiers in nested pointer types [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
          g_atomic_pointer_compare_and_exchange (&nm_bt_vtable_network_server, &priv->vtable_network_server, NULL);
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/glib-2.0/glib/gatomic.h:192:44: note: expanded from macro 'g_atomic_pointer_compare_and_exchange'
      __atomic_compare_exchange_n ((atomic), &gapcae_oldval, (newval), FALSE, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) ? TRUE : FALSE; \
                                             ^~~~~~~~~~~~~~
  ../src/devices/nm-device.c:8857:8: error: incompatible pointer types passing 'typeof ((((void *)0))) *' (aka 'void **') to parameter of type 'GBytes **' (aka 'struct _GBytes **') [-Werror,-Wincompatible-pointer-types]
                  if (!g_atomic_pointer_compare_and_exchange (&global_duid, NULL, p)) {
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  /usr/include/glib-2.0/glib/gatomic.h:192:44: note: expanded from macro 'g_atomic_pointer_compare_and_exchange'
      __atomic_compare_exchange_n ((atomic), &gapcae_oldval, (newval), FALSE, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) ? TRUE : FALSE; \
                                             ^~~~~~~~~~~~~~

The issue happens because glib passes the "atomic" argument to

  __atomic_compare_exchange_n ((atomic), &gapcae_oldval, (newval), FALSE, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)

without cast, and clang 9 seems to be picky about const pointers.
Add our own version of the macro that does better casts while also having
better compile time checks for valid arguments.

(cherry picked from commit f5b0713651)
(cherry picked from commit d8cc6af058)
2020-04-20 09:33:16 +02:00
..
nm-c-list.h shared: add nm_c_list_elem_free_steal() util 2019-07-02 17:52:53 +02:00
nm-dbus-aux.c shared: add nm_dbus_connection_signal_subscribe_name_owner_changed() helper 2019-05-12 09:56:36 +02:00
nm-dbus-aux.h shared: add nm_dbus_connection_call_start_service_by_name() helper 2019-05-12 09:56:36 +02:00
nm-dedup-multi.c all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-dedup-multi.h all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-enum-utils.c all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-enum-utils.h all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-errno.c shared: move most of "shared/nm-utils" to "shared/nm-glib-aux" 2019-04-18 19:57:27 +02:00
nm-errno.h shared: move most of "shared/nm-utils" to "shared/nm-glib-aux" 2019-04-18 19:57:27 +02:00
nm-glib.h shared/glib: reimplement g_atomic_pointer_compare_and_exchange() macro 2020-04-20 09:33:16 +02:00
nm-hash-utils.c shared: add nm_pdirect_hash()/nm_pdirect_equal() 2019-07-10 12:43:06 +02:00
nm-hash-utils.h shared: add NM_HASH_SEED_16() macro 2019-07-31 10:44:37 +02:00
nm-io-utils.c shared: add nm_utils_file_stat() util 2019-06-26 09:53:54 +02:00
nm-io-utils.h shared: add nm_utils_file_stat() util 2019-06-26 09:53:54 +02:00
nm-jansson.h all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-json-aux.c shared: add nm_json_aux_gstr_append_*() helper 2019-05-23 18:09:49 +02:00
nm-json-aux.h shared: add JSON helper functions for NMValueType 2019-05-23 18:09:49 +02:00
nm-keyfile-aux.c shared: fix non-serious bug with bogus condition in assertion in nm_key_file_db_ref() 2019-08-01 17:25:37 +02:00
nm-keyfile-aux.h shared: add NMKeyFileDB API 2019-05-07 16:41:21 +02:00
nm-logging-fwd.h shared: implement _nm_utils_monotonic_timestamp_initialized() in "nm-logging-stub.c" 2019-05-22 20:04:08 +02:00
nm-macros-internal.h shared: add nm_g_slice_free() helper 2019-07-25 15:26:49 +02:00
nm-obj.h all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-random-utils.c all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-random-utils.h all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-secret-utils.c all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-secret-utils.h all: drop emacs file variables from source files 2019-06-11 10:04:00 +02:00
nm-shared-utils.c shared: refactor nm_utils_g_slist_strlist_cmp() to avoid dead-code warning from Coverity 2019-08-02 11:10:51 +02:00
nm-shared-utils.h shared: add nm_strcmp0_p_with_data() helper 2019-07-25 10:43:44 +02:00
nm-time-utils.c core: improve code comment and add assertion to nm_utils_monotonic_timestamp_as_boottime() 2019-07-25 15:10:43 +02:00
nm-time-utils.h shared: add nm_utils_clock_gettime_*() util 2019-07-23 12:19:22 +02:00
nm-value-type.h shared: fix return in nm_value_type_to_variant()/nm_value_type_get_variant_type() 2019-05-27 13:27:13 +02:00