*/
#define foreach_ptr(i, ...) \
for (unsigned _foreach_i \
- = (((i) = ((const void *[]){ __VA_ARGS__ })[0]), 0); \
+ = (((i) = (void *)((FOREACH_TYPEOF(i)[]){ __VA_ARGS__ })[0]), 0); \
(i); \
(i) = (void *)((FOREACH_TYPEOF(i)[]) \
{ __VA_ARGS__, NULL})[++_foreach_i], \
(i) = (int[]) { __VA_ARGS__, 0 }[_foreach_iter_inc(&(i))])
#define foreach_ptr(i, ...) \
- for ((i) = ((FOREACH_TYPEOF(i)[]){ __VA_ARGS__ })[0], \
+ for ((i) = (void *)((FOREACH_TYPEOF(i)[]){ __VA_ARGS__ })[0], \
_foreach_iter_init(&(i)); \
(i); \
(i) = (void *)((FOREACH_TYPEOF(i)[]){ __VA_ARGS__, NULL }) \
[_foreach_iter_inc(&(i))], \
_foreach_no_nullval(_foreach_iter(&(i)), i, \
- ((void *[]){ __VA_ARGS__})))
+ ((const void *[]){ __VA_ARGS__})))
void _foreach_iter_init(const void *i);
unsigned int _foreach_iter(const void *i);
--- /dev/null
+#include <ccan/foreach/foreach.h>
+#include <ccan/foreach/foreach.c>
+
+/* Iterating over const pointers should work fine. */
+int main(int argc, char *argv[])
+{
+ const char *s1 = "hello", *s2 = "world", *p;
+ unsigned int i = 0;
+
+ foreach_ptr(p, s1, s2)
+ i++;
+
+ return i == 2 ? 0 : 1;
+}
--- /dev/null
+#include <ccan/foreach/foreach.h>
+#include <ccan/foreach/foreach.c>
+
+/* Iterating const over non-const pointers should work fine. */
+int main(int argc, char *argv[])
+{
+ char *p;
+ unsigned int i = 0;
+
+ foreach_ptr(p, argv[0], argv[1])
+ i++;
+
+ return i == 2 ? 0 : 1;
+}