> -----Original Message----- > From: Eric Lemings [mailto:[EMAIL PROTECTED] > Sent: Thursday, June 12, 2008 4:37 PM > To: dev@stdcxx.apache.org > Subject: RE: static_assert config check > > > > > -----Original Message----- > > From: Travis Vitek [mailto:[EMAIL PROTECTED] > > Sent: Thursday, June 12, 2008 4:00 PM > > To: dev@stdcxx.apache.org > > Subject: RE: static_assert config check > > > > > > > > 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? > > Or...you could run the negative test _first_ and if that fails (i.e. > does not fire as assertion), run the positive test which will produce > _RWSTD_NO_STATIC_ASSERT only if one or both tests failed.
Ehh, to clarify a bit: STATIC_ASSERT_FAIL.cpp: static_assert (false, "Grep for this exact text in the compiler diagnostics"); STATIC_ASSSERT.cpp: (Same as Travis' static assert test posted earlier.) In pseudo-script: compile the negative test if the compile command succeeds, {echo "#define _RWSTD_NO_STATIC_ASSERT" >>$BUILDDIR/include/config.h} else grep the compiler diagnostic output for the text in the static_assert statement if the text is found in the compiler output, compile the STATIC_ASSERT.cpp if the compile command fails, {echo "#define _RWSTD_NO_STATIC_ASSERT" >>$BUILDDIR/include/config.h} endif endif endif I think I got that right. :P Brad.