Browse Source

foreach: more const iteration fixes.

Shown up by -Wwrite-strings.
Rusty Russell 15 years ago
parent
commit
e2fc21e505

+ 3 - 3
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);

+ 14 - 0
ccan/foreach/test/compile_ok-const.c

@@ -0,0 +1,14 @@
+#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;
+}

+ 14 - 0
ccan/foreach/test/compile_ok-nonconst.c

@@ -0,0 +1,14 @@
+#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;
+}