Martin Sebor wrote: >Travis Vitek wrote: >>> Eric Lemings wrote: >>> >>> >>> How's this for a suitable configuration check for static_assert? >>> >>> // compile-only test >>> >>> static_assert (sizeof (char) == 1, "impossible"); >>> >>> template <int I> struct S { >>> static_assert (I >= 0, "template parameter I must be >>> non-negative"); >>> }; >>> >> >> I've written an errily similar test already (pasted below) >> >> I think you should probably instantiate S somewhere and it might be a >> good idea put a line break before 'struct' so that your code >> conforms to our 'coding standards'. >[...] > >It's probably overkill, but just as an FYI, to verify this works >both ways the test would need to be negative, i.e., named NO_XXX, >and write #define _RWSTD_NO_XXX to stdout if the negative assert >failed to fire.
So how exactly is the test supposed to write anything to stdout if it doesn't compile? If the expression of the static_assert is false, the program is ill-formed and the compiler is to emit a diagnostic. I'm looking at this and if I name the test NO_STATIC_ASSERT.cpp and it fails to compile, the macro _RWSTD_NO_STATIC_ASSERT wll be defined, so using the NO_ prefix doesn't really buy me anything. I don't think it would be right to make it so that if a NO_XXX test fails to compile the macro _RWSTD_NO_XXX will not be defined. The only way I see to ensure that static_assert is actually working both ways is to write two tests, one testing for passing conditions [STATIC_ASSERT_PASS.cpp], and the other testing for failing conditions [STATIC_ASSERT_FAIL.cpp]. Then we would define _RWSTD_NO_STATIC_ASSERT like so... #if !defined (_RWSTD_NO_STATIC_ASSERT_PASS) || defined (_RWSTD_NO_STATIC_ASSERT_FAIL) // STATIC_ASSERT_PASS.cpp failed to compile // STATIC_ASSERT_FAIL.cpp compiled without error # define _RWSTD_NO_STATIC_ASSERT #endif Is that overkill? >Martin > >> template <int _N> >> struct S >> { >> static_assert (0 < _N, "fail"); >> }; >> >> template <int _N> >> void f () >> { >> static_assert (0 < _N, "fail"); >> } >> >> int main () >> { >> S<1> s1; >> f<1>(); >> static_assert (1, "pass"); >> >> return 0; >> } > >