From: Rusty Russell Date: Tue, 22 Mar 2011 03:35:33 +0000 (+1030) Subject: foreach: more const iteration fixes. X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=e2fc21e505ed7dd5bcf1fe2ad7a5c1000e743cee foreach: more const iteration fixes. Shown up by -Wwrite-strings. --- diff --git a/ccan/foreach/foreach.h b/ccan/foreach/foreach.h index 73c4c693..8e08548f 100644 --- a/ccan/foreach/foreach.h +++ b/ccan/foreach/foreach.h @@ -44,7 +44,7 @@ */ #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], \ @@ -59,13 +59,13 @@ (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); diff --git a/ccan/foreach/test/compile_ok-const.c b/ccan/foreach/test/compile_ok-const.c new file mode 100644 index 00000000..d1c858a0 --- /dev/null +++ b/ccan/foreach/test/compile_ok-const.c @@ -0,0 +1,14 @@ +#include +#include + +/* 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; +} diff --git a/ccan/foreach/test/compile_ok-nonconst.c b/ccan/foreach/test/compile_ok-nonconst.c new file mode 100644 index 00000000..e533a9d3 --- /dev/null +++ b/ccan/foreach/test/compile_ok-nonconst.c @@ -0,0 +1,14 @@ +#include +#include + +/* 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; +}