Hi there,
I was looking into libc++, and noticed the implementation of static_assert
for pre-c++11 compilers.
Inside of the _LIBCPP_HAS_NO_STATIC_ASSERT ifdef, there is a typo (__t
should be __m I presume?),
Nope.
but even when that is fixed, I can't see how the
static assert macro could work.
It would expand to
typedef __static_assert_check<unsigned> "some message";
in both the true and false case. For the false case it fails to compile the
__static_assert_check<unsigned> already, but for the true case it also fails
to compile. How should that work?
For me, preprocessing this in C++03 mode:
#include <__config>
int main()
{
const int i = 0;
static_assert(i == 0, "");
}
Yields:
typedef __char16_t char16_t;
typedef __char32_t char32_t;
namespace std {
inline namespace __1 {
}
}
template <bool> struct __static_assert_test;
template <> struct __static_assert_test<true> {};
template <unsigned> struct __static_assert_check {};
int main()
{
const int i = 0;
typedef __static_assert_check<sizeof(__static_assert_test<(i == 0)>)> __t6;
}
Since i == 0 is true, __static_assert_test<true> is instantiated, which has a complete type. So __t6 is a typedef for:
__static_assert_check<sizeof(__static_assert_test<true>)>
If i != 0, an attempt would be made to form a typedef to:
__static_assert_check<sizeof(__static_assert_test<false>)>
but __static_assert_test<false> is an incomplete type, and thus a compile time error will be emitted.
Is this not the behavior you're seeing?
Howard