Clang 3.3 with -O2 optimisations is especially picky about arithmetic on
NULL pointers. This undefined behavior is turned into optimized out NULL
checks by clang 3.3. Fix the undefined behavior by checking against the
pointer directly, without going back and forth around NULL with
pointer arithmetic.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
entry = cds_hlist_entry(pos, __typeof__(*entry), member))
#define cds_hlist_for_each_entry_2(entry, head, member) \
entry = cds_hlist_entry(pos, __typeof__(*entry), member))
#define cds_hlist_for_each_entry_2(entry, head, member) \
- for (entry = cds_hlist_entry((head)->next, __typeof__(*entry), member); \
- &entry->member != NULL; \
- entry = cds_hlist_entry(entry->member.next, __typeof__(*entry), member))
+ for (entry = ((head)->next == NULL ? NULL \
+ : cds_hlist_entry((head)->next, __typeof__(*entry), member)); \
+ entry != NULL; \
+ entry = (entry->member.next == NULL ? NULL \
+ : cds_hlist_entry(entry->member.next, __typeof__(*entry), member)))
#define cds_hlist_for_each_entry_safe_2(entry, e, head, member) \
#define cds_hlist_for_each_entry_safe_2(entry, e, head, member) \
- for (entry = cds_hlist_entry((head)->next, __typeof__(*entry), member); \
- (&entry->member != NULL) && (e = cds_hlist_entry(entry->member.next, \
- __typeof__(*entry), member), 1); \
+ for (entry = ((head)->next == NULL ? NULL \
+ : cds_hlist_entry((head)->next, __typeof__(*entry), member)); \
+ (entry != NULL) && (e = (entry->member.next == NULL ? NULL \
+ : cds_hlist_entry(entry->member.next, \
+ __typeof__(*entry), member), 1)); \
entry = e)
#endif /* _KCOMPAT_HLIST_H */
entry = e)
#endif /* _KCOMPAT_HLIST_H */