Use __typeof__ instead of typeof
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 20 Jan 2022 14:32:56 +0000 (09:32 -0500)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Fri, 28 Jan 2022 16:22:26 +0000 (11:22 -0500)
When compiling the ctf plugin as C++, a common error was:

    In file included from /home/simark/src/babeltrace/src/plugins/ctf/common/bfcr/bfcr.cpp:23:
    /home/simark/src/babeltrace/src/plugins/ctf/common/bfcr/bfcr.cpp: In function ‘void read_unsigned_bitfield(bt_bfcr*, const uint8_t*, size_t, unsigned int, ctf_byte_order, uint64_t*)’:
    /home/simark/src/babeltrace/src/compat/bitfield.h:343:9: error: ‘typeof’ was not declared in this scope
      343 |         typeof(*(vptr)) *_vptr = (vptr);                                \
          |         ^~~~~~

Use __typeof__ instead, gcc and clang seem happy with that in both C and
C++.  Using `decltype` or `auto` would be more C++-y, but using
__typeof__ works and we don't need separate paths for both languages.

Change-Id: Iec503420f27dd2fe0a246d02af9380a2cff1c96e
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/7098
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
src/common/align.h
src/common/list.h
src/common/macros.h
src/compat/compiler.h

index a9c88de8ed9e5d9cf47bdbb9b5e4cdb7ed588690..0d4c0150aed189cb7f14bf49308fddc783cf0920 100644 (file)
 #include "compat/compiler.h"
 #include "compat/limits.h"
 
-#define BT_ALIGN(x, a)         __BT_ALIGN_MASK(x, (typeof(x))(a) - 1)
+#define BT_ALIGN(x, a)         __BT_ALIGN_MASK(x, (__typeof__(x))(a) - 1)
 #define __BT_ALIGN_MASK(x, mask)       (((x) + (mask)) & ~(mask))
-#define BT_PTR_ALIGN(p, a)             ((typeof(p)) BT_ALIGN((unsigned long) (p), a))
-#define BT_ALIGN_FLOOR(x, a)   __BT_ALIGN_FLOOR_MASK(x, (typeof(x)) (a) - 1)
+#define BT_PTR_ALIGN(p, a)             ((__typeof__(p)) BT_ALIGN((unsigned long) (p), a))
+#define BT_ALIGN_FLOOR(x, a)   __BT_ALIGN_FLOOR_MASK(x, (__typeof__(x)) (a) - 1)
 #define __BT_ALIGN_FLOOR_MASK(x, mask) ((x) & ~(mask))
 #define BT_PTR_ALIGN_FLOOR(p, a) \
-                       ((typeof(p)) BT_ALIGN_FLOOR((unsigned long) (p), a))
-#define BT_IS_ALIGNED(x, a)    (((x) & ((typeof(x)) (a) - 1)) == 0)
+                       ((__typeof__(p)) BT_ALIGN_FLOOR((unsigned long) (p), a))
+#define BT_IS_ALIGNED(x, a)    (((x) & ((__typeof__(x)) (a) - 1)) == 0)
 
 /*
  * Align pointer on natural object alignment.
index 565fc6871ab75275e3378f03957d1f6cc804596e..193bf2d7063c3955daed255a8c61abc80465d316 100644 (file)
@@ -130,20 +130,20 @@ bt_list_splice (struct bt_list_head *add, struct bt_list_head *head)
        pos = p, p = pos->prev)
 
 #define bt_list_for_each_entry(pos, head, member)                              \
-       for (pos = bt_list_entry((head)->next, typeof(*pos), member);   \
+       for (pos = bt_list_entry((head)->next, __typeof__(*pos), member);       \
             &pos->member != (head);                                    \
-            pos = bt_list_entry(pos->member.next, typeof(*pos), member))
+            pos = bt_list_entry(pos->member.next, __typeof__(*pos), member))
 
 #define bt_list_for_each_entry_reverse(pos, head, member)                      \
-       for (pos = bt_list_entry((head)->prev, typeof(*pos), member);   \
+       for (pos = bt_list_entry((head)->prev, __typeof__(*pos), member);       \
             &pos->member != (head);                                    \
-            pos = bt_list_entry(pos->member.prev, typeof(*pos), member))
+            pos = bt_list_entry(pos->member.prev, __typeof__(*pos), member))
 
 #define bt_list_for_each_entry_safe(pos, p, head, member)                      \
-       for (pos = bt_list_entry((head)->next, typeof(*pos), member),   \
-                    p = bt_list_entry(pos->member.next,typeof(*pos), member); \
+       for (pos = bt_list_entry((head)->next, __typeof__(*pos), member),       \
+                    p = bt_list_entry(pos->member.next, __typeof__(*pos), member); \
             &pos->member != (head);                                    \
-            pos = p, p = bt_list_entry(pos->member.next, typeof(*pos), member))
+            pos = p, p = bt_list_entry(pos->member.next, __typeof__(*pos), member))
 
 static inline int bt_list_empty(struct bt_list_head *head)
 {
index 9014afc2c637d1b1df6eb31764c4815074ae03c3..5549b8576fe251bd196a79b361bc054019d76239 100644 (file)
@@ -43,7 +43,7 @@ extern "C" {
 
 #define BT_MOVE_REF(ref)               \
        ({                              \
-               typeof(ref) _ref = ref; \
+               __typeof__(ref) _ref = ref;     \
                ref = NULL;             \
                _ref;                   \
        })
index 2c852742d9007f4ba6f6160ae4ea6942d0c32d53..90e80da89c097ee2132c94cf5080e99e08b9eb2a 100644 (file)
@@ -14,7 +14,7 @@
 #ifndef container_of
 #define container_of(ptr, type, member)                                        \
        ({                                                              \
-               const typeof(((type *)NULL)->member) * __ptr = (ptr);   \
+               const __typeof__(((type *)NULL)->member) * __ptr = (ptr);       \
                (type *)((char *)__ptr - offsetof(type, member));       \
        })
 #endif
This page took 0.026519 seconds and 4 git commands to generate.