Browse Source

tally: fixes for 64 bit machines.

Rusty Russell 15 years ago
parent
commit
65c7607d78
2 changed files with 6 additions and 3 deletions
  1. 1 1
      ccan/tally/tally.c
  2. 5 2
      ccan/tally/test/run-total.c

+ 1 - 1
ccan/tally/tally.c

@@ -322,7 +322,7 @@ ssize_t tally_total(const struct tally *tally, ssize_t *overflow)
 	}
 
 	/* If result is negative, make sure we can represent it. */
-	if (tally->total[1] & (1 << (SIZET_BITS-1))) {
+	if (tally->total[1] & ((size_t)1 << (SIZET_BITS-1))) {
 		/* Must have only underflowed once, and must be able to
 		 * represent result at ssize_t. */
 		if ((~tally->total[1])+1 != 0

+ 5 - 2
ccan/tally/test/run-total.c

@@ -38,14 +38,17 @@ int main(void)
 	tally_add(tally, max);
 	total = tally_total(tally, &overflow);
 	ok1(overflow == 0);
-	ok1((size_t)total == 0xFFFFFFFE);
+	ok1((size_t)total == (size_t)-2);
 	ok1(tally_total(tally, NULL) == max);
 
 	/* Overflow into upper size_t. */
 	tally_add(tally, max);
 	total = tally_total(tally, &overflow);
 	ok1(overflow == 1);
-	ok1((size_t)total == 0x7FFFFFFD);
+	if (sizeof(size_t) == 4)
+		ok1((size_t)total == 0x7FFFFFFD);
+	else if (sizeof(size_t) == 8)
+		ok1((size_t)total == 0x7FFFFFFFFFFFFFFDULL);
 	ok1(tally_total(tally, NULL) == max);
 	free(tally);