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;
>> }
>
>