Index: kernel/generic/include/adt/hash_table.h
===================================================================
--- kernel/generic/include/adt/hash_table.h	(revision 5e801dccc49faadcb18cd8ddee6200633e8f11b8)
+++ kernel/generic/include/adt/hash_table.h	(revision 1aa0e380b50a49fcd7536c60dde5800c2965e6ce)
@@ -41,4 +41,5 @@
 #include <stdbool.h>
 #include <macros.h>
+#include <member.h>
 
 /** Opaque hash table link type. */
Index: kernel/generic/include/adt/list.h
===================================================================
--- kernel/generic/include/adt/list.h	(revision 5e801dccc49faadcb18cd8ddee6200633e8f11b8)
+++ kernel/generic/include/adt/list.h	(revision 1aa0e380b50a49fcd7536c60dde5800c2965e6ce)
@@ -38,6 +38,9 @@
 
 #include <assert.h>
+#include <macros.h>
+#include <member.h>
 #include <stdbool.h>
 #include <stddef.h>
+#include <stdint.h>
 #include <trace.h>
 
@@ -89,8 +92,8 @@
 
 #define list_get_instance(link, type, member) \
-	((type *) (((void *)(link)) - list_link_to_void(&(((type *) NULL)->member))))
+	member_to_inst(link, type, member)
 
 #define list_foreach(list, member, itype, iterator) \
-	for (itype *iterator = NULL; iterator == NULL; iterator = (itype *) 1) \
+	for (itype *iterator = NULL; iterator == NULL; iterator = &((itype *) NULL)[1]) \
 		for (link_t *_link = (list).head.next; \
 		    iterator = list_get_instance(_link, itype, member), \
@@ -98,5 +101,5 @@
 
 #define list_foreach_rev(list, member, itype, iterator) \
-	for (itype *iterator = NULL; iterator == NULL; iterator = (itype *) 1) \
+	for (itype *iterator = NULL; iterator == NULL; iterator = &((itype *) NULL)[1]) \
 		for (link_t *_link = (list).head.prev; \
 		    iterator = list_get_instance(_link, itype, member), \
@@ -375,7 +378,7 @@
  *
  */
-static inline link_t *list_nth(const list_t *list, unsigned long n)
-{
-	unsigned long cnt = 0;
+static inline link_t *list_nth(const list_t *list, size_t n)
+{
+	size_t cnt = 0;
 
 	link_t *link = list_first(list);
@@ -391,13 +394,4 @@
 }
 
-/** Verify that argument type is a pointer to link_t (at compile time).
- *
- * This can be used to check argument type in a macro.
- */
-static inline const void *list_link_to_void(const link_t *link)
-{
-	return link;
-}
-
 /** Determine if link is used.
  *
Index: kernel/generic/include/adt/odict.h
===================================================================
--- kernel/generic/include/adt/odict.h	(revision 5e801dccc49faadcb18cd8ddee6200633e8f11b8)
+++ kernel/generic/include/adt/odict.h	(revision 1aa0e380b50a49fcd7536c60dde5800c2965e6ce)
@@ -37,4 +37,5 @@
 
 #include <errno.h>
+#include <member.h>
 #include <stdbool.h>
 #include <stddef.h>
@@ -42,5 +43,5 @@
 
 #define odict_get_instance(odlink, type, member) \
-	((type *)( (void *)(odlink) - ((void *) &((type *) NULL)->member)))
+	member_to_inst(odlink, type, member)
 
 extern void odict_initialize(odict_t *, odgetkey_t, odcmp_t);
