Re: beast-0.7.4 issues with g++-4.5



   Hi!

On Tue, Apr 19, 2011 at 07:40:10PM +0200, Tim Janik wrote:
> On Tue, 19 Apr 2011, Stefan Westerfeld wrote:
> >On Sat, Apr 09, 2011 at 09:09:23PM +0200, Stefan Westerfeld wrote:
> 
> >>CXX    birnetutils.lo
> >>birnetutils.cc:253:111: error: array bound is not an integer constant before ']' token
> >>birnetutils.cc:254:111: error: array bound is not an integer constant before ']' token
> >>birnetutils.cc:255:109: error: array bound is not an integer constant before ']' token
> >
> >I investigated the issue a little further. First of all, I tried using BOOST_STATIC_ASSERT
> >instead of BIRNET_STATIC_ASSERT, just to see if our static assertion facility needs to
> >be fixed. However, BOOST_STATIC_ASSERT behaves the same way like BIRNET_STATIC_ASSERT:
> >it fails on those expressions involving DBL_MIN/DBL_MAX/DBL_EPSILON on g++-4.5, and
> >succeeds with g++-4.4. There are IMHO several ways to fix compilation with g++-4.5.
> 
> >4) Move assertions to runtime checks at startup. For instance with global
> >constructors, we could keep the test in the same file, but the constructor
> >would do the assertions and prevent starting BEAST if the test does not work.
> >
> >5) We could disable these static assertions altogether (or conditionally for
> >g++ >= 4.5.0) , but I think thats not such a good option, as they were designed
> >to prevent problems down the road, so I'm not considering this at the moment.
> >
> >As there are multiple approaches on how to fix the issue, I'd like some
> >guidance here as on which approach to take. I can make a patch/merge request
> >for approach 2, 3 or 4, as soon as the decision on which route to take is made.
> 
> I'd favor something similar to the effect of 4, but I really think the compiler
> needs fixing here. I.e. we should just hold the horses here and see how the GCC/Boost
> teams are sorting it out. Both have more resources and a wider user base than Beast,
> so being patient will just provide a solution automatically.
> Until then, only GCC-4.4 is supported by Beast/Rapicorn, which is fine.

I don't believe waiting will do much good, since in general the Boost and
Birnet static assertions work just fine. Its only if you use DBL_MIN/DBL_MAX or
DBL_EPSILON in a static assertions that g++-4.5 is rejecting the code. I
consider it unlikely that many projects will run into this specific problem.

Supporting only GCC-4.4 might be a problem for some packagers, and I'd rather
solve these problems as early as possible, to keep the packagers happy.

In any case, I've made an implementation for startup asserts, and put it into

repo:   http://space.twc.de/public/git/stwbeast.git
branch: static-assert-fixes

I'm including the patch:

diff --git a/birnet/birnetcdefs.h b/birnet/birnetcdefs.h
index 0cb882c..7246a31 100644
--- a/birnet/birnetcdefs.h
+++ b/birnet/birnetcdefs.h
@@ -111,6 +111,15 @@ BIRNET_EXTERN_C_BEGIN();
 #define BIRNET_CPP_PASTE2(a,b)                  BIRNET_CPP_PASTE2i (a,b)
 #define BIRNET_STATIC_ASSERT_NAMED(expr,asname) typedef struct { char asname[(expr) ? 1 : -1]; } BIRNET_CPP_PASTE2 (Birnet_StaticAssertion_LINE, __LINE__)
 #define BIRNET_STATIC_ASSERT(expr)              BIRNET_STATIC_ASSERT_NAMED (expr, compile_time_assertion_failed)
+#define BIRNET_STARTUP_ASSERT_IMPL(expr,asname) \
+  namespace Birnet { \
+    namespace StartupAssert { \
+      struct asname { \
+        asname() { g_assert (expr); } \
+      } BIRNET_CPP_PASTE2(asname,_instance); \
+    } \
+  }
+#define BIRNET_STARTUP_ASSERT(expr)             BIRNET_STARTUP_ASSERT_IMPL(expr, BIRNET_CPP_PASTE2 (Assertion_LINE, __LINE__))
 
 /* --- attributes --- */
 #if     __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)
diff --git a/birnet/birnetutils.cc b/birnet/birnetutils.cc
index 6a45bda..4baae02 100644
--- a/birnet/birnetutils.cc
+++ b/birnet/birnetutils.cc
@@ -250,9 +250,9 @@ BIRNET_STATIC_ASSERT (UINT64_MAX   == +18446744073709551615LLU);
 BIRNET_STATIC_ASSERT (FLT_MIN      <= 1E-37);
 BIRNET_STATIC_ASSERT (FLT_MAX      >= 1E+37);
 BIRNET_STATIC_ASSERT (FLT_EPSILON  <= 1E-5);
-BIRNET_STATIC_ASSERT (DBL_MIN      <= 1E-37);
-BIRNET_STATIC_ASSERT (DBL_MAX      >= 1E+37);
-BIRNET_STATIC_ASSERT (DBL_EPSILON  <= 1E-9);
+BIRNET_STARTUP_ASSERT (DBL_MIN      <= 1E-37);
+BIRNET_STARTUP_ASSERT (DBL_MAX      >= 1E+37);
+BIRNET_STARTUP_ASSERT (DBL_EPSILON  <= 1E-9);
 BIRNET_STATIC_ASSERT (LDBL_MIN     <= 1E-37);
 BIRNET_STATIC_ASSERT (LDBL_MAX     >= 1E+37);
 BIRNET_STATIC_ASSERT (LDBL_EPSILON <= 1E-9);

   Cu... Stefan
-- 
Stefan Westerfeld, Hamburg/Germany, http://space.twc.de/~stefan


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]