--- old/src/share/vm/utilities/debug.hpp 2014-12-11 23:19:23.818000000 -0500 +++ new/src/share/vm/utilities/debug.hpp 2014-12-11 23:19:23.740000000 -0500 @@ -225,21 +225,23 @@ void warning(const char* format, ...) ATTRIBUTE_PRINTF(1, 2); -#ifdef ASSERT -// Compile-time asserts. -template struct StaticAssert; -template <> struct StaticAssert {}; +// Compile-time asserts. Cond must be a compile-time constant expression that +// is convertible to bool. STATIC_ASSERT() can be used anywhere a declaration +// may appear. +// +// Implementation Note: STATIC_ASSERT_FAILURE provides a value member +// rather than type member that could be used directly in the typedef, because +// a type member would require conditional use of "typename", depending on +// whether Cond is dependent or not. The use of a value member leads to the +// use of an array type. -// Only StaticAssert is defined, so if cond evaluates to false we get -// a compile time exception when trying to use StaticAssert. -#define STATIC_ASSERT(cond) \ - do { \ - StaticAssert<(cond)> DUMMY_STATIC_ASSERT; \ - (void)DUMMY_STATIC_ASSERT; /* ignore */ \ - } while (false) -#else -#define STATIC_ASSERT(cond) -#endif +template struct STATIC_ASSERT_FAILURE; +template<> struct STATIC_ASSERT_FAILURE { enum { value = 1 }; }; + +#define STATIC_ASSERT(Cond) \ + typedef char STATIC_ASSERT_FAILURE_ ## __LINE__ [ \ + STATIC_ASSERT_FAILURE< (Cond) ? true : false >::value ] \ + /* */ // out of shared space reporting enum SharedSpaceType {