Browse Source

Have autoconf check whether enums are signed.

Fixes bug 7727; fix on 0.2.4.10-alpha.
Nick Mathewson 11 years ago
parent
commit
41200b4770
4 changed files with 11 additions and 2 deletions
  1. 3 0
      changes/signof_enum
  2. 6 0
      configure.ac
  3. 1 2
      src/common/compat.h
  4. 1 0
      src/win32/orconfig.h

+ 3 - 0
changes/signof_enum

@@ -2,3 +2,6 @@
     - Use Ville Laurikari's implementation of AX_CHECK_SIGN() to determine
       the signs of types during autoconf. This is better than our old
       approach, which didn't work when cross-compiling.
+    - Detect the sign of enum values, rather than assuming that MSC is the
+      only compiler where enum types are all signed. Fix for bug 7727;
+      bugfix on 0.2.4.10-alpha.

+ 6 - 0
configure.ac

@@ -984,6 +984,12 @@ if test "$tor_cv_size_t_signed" = yes; then
   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
 fi
 
+AX_CHECK_SIGN([enum always],
+       [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
+       [ : ], [
+ enum always { AAA, BBB, CCC };
+])
+
 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>

+ 1 - 2
src/common/compat.h

@@ -136,8 +136,7 @@ extern INLINE double U64_TO_DBL(uint64_t x) {
 #define DBL_TO_U64(x) ((uint64_t) (x))
 #endif
 
-#if defined(_MSC_VER)
-/* XXXX024 we should instead have a more general check for "Is enum signed?"*/
+#ifdef ENUM_VALS_ARE_SIGNED
 #define ENUM_BF(t) unsigned
 #else
 /** Wrapper for having a bitfield of an enumerated type. Where possible, we

+ 1 - 0
src/win32/orconfig.h

@@ -256,3 +256,4 @@
 #define CURVE25519_ENABLED
 #define USE_CURVE25519_DONNA
 
+#define ENUM_VALS_ARE_SIGNED 1