1 /* Reduced/adapted from false positive from -Wanalyzer-free-of-non-heap
2 seen on rdma-core. */
3
4 #include <stddef.h>
5
6 #define check_types_match(expr1, expr2) \
7 ((typeof(expr1) *)0 != (typeof(expr2) *)0)
8
9 #define container_of(member_ptr, containing_type, member) \
10 ((containing_type *) \
11 ((char *)(member_ptr) \
12 - container_off(containing_type, member)) \
13 + check_types_match(*(member_ptr), ((containing_type *)0)->member))
14
15 #define container_off(containing_type, member) \
16 offsetof(containing_type, member)
17
18 struct ibv_device {
19 /* [...snip...] */
20 };
21
22 struct verbs_device {
23 struct ibv_device device; /* Must be first */
24 /* [...snip...] */
25 int placeholder;
26 };
27
28 struct mlx5_device {
29 struct verbs_device verbs_dev;
30 int placeholder;
31 };
32
33 static inline struct mlx5_device *to_mdev(struct ibv_device *ibdev)
34 {
35 return container_of(ibdev, struct mlx5_device, verbs_dev.device);
36 }
37
38 static void mlx5_uninit_device(struct verbs_device *verbs_device)
39 {
40 struct mlx5_device *dev = to_mdev(&verbs_device->device);
41
42 __builtin_free(dev); /* { dg-bogus "not on the heap" } */
43 }