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>
#include "compat/compiler.h"
#include "compat/limits.h"
#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_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) \
#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.
/*
* Align pointer on natural object alignment.
pos = p, p = pos->prev)
#define bt_list_for_each_entry(pos, head, member) \
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->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) \
#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->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) \
#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->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)
{
static inline int bt_list_empty(struct bt_list_head *head)
{
#define BT_MOVE_REF(ref) \
({ \
#define BT_MOVE_REF(ref) \
({ \
- typeof(ref) _ref = ref; \
+ __typeof__(ref) _ref = ref; \
#ifndef container_of
#define container_of(ptr, type, member) \
({ \
#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
(type *)((char *)__ptr - offsetof(type, member)); \
})
#endif