Re: Testing for code that should not compile?
francis_r wrote:
Tester::CheckNoCompile( "Widget();" ); // Tester should report error
if it compiles on Tester's compiler
But then Tester should actually repeat the work done so far by the
compiler, i.e. compile the Widget declaration with everything it
depends on.
Currently I use the following for this purpose:
#define DEBUGTOOLS_CONCAT(x,y) DEBUGTOOLS_CONCAT_(x,y)
#define DEBUGTOOLS_CONCAT_(x,y) x ## y
#define DEBUGTOOLS_COMPILER_ERROR( id ) \
enum DEBUGTOOLS_CONCAT( __MsgEnum, __LINE__ ) \
{ DEBUGTOOLS_CONCAT( __MsgEnumVal, __LINE__ ) = 0x7fffffff, \
DEBUGTOOLS_CONCAT( id, DEBUGTOOLS_CONCAT( _, __LINE__ ) ) };
#ifdef DEBUGTOOLS_TEST_NOCOMPILE
#define TEST_NOCOMPILE( expr ) \
DEBUGTOOLS_COMPILER_ERROR(
A_compilation_error_should_follow_on_this_line ) \
expr
#else
#define TEST_NOCOMPILE( expr ) ((void)0)
#endif
Then I use TEST_NOCOMPILE( somecode ) in my test cases, and when I work
on some component I enable DEBUGTOOLS_TEST_NOCOMPILE and check visually
if all file(line) messages in the compiler output are met (at least)
twice - the first is for the
A_compilation_error_should_follow_on_this_line deliberate error and the
second (or more) for the actual error.
It's a bit heavy and not automatic, but enough for me. Even if you
don't check with the compiler that the code really doesn't compile, the
TEST_NOCOMPILE macros serve as good documentation.
I suppose for a language like C++ which counts very much on catching
errors at compile-time, there should be appropriate test tools for that
(don't know at what level - the language, the compiler, the IDE, or
some other).
Regards,
Ivan
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]