Boost logo

Boost :

From: Andreas Harnack (ah.boost.04_at_[hidden])
Date: 2007-03-01 06:34:24


Matthias Schabel wrote:
> Naturally, for compile-time units there are some cases where compile-
> time failure is
> the correct behavior - how should I structure tests so that this is
> recognized? Presumably
> I need to have a separate test source file for each expected
> compilation error, right?

Hi Matthias,
I'm using the following little program:

$ cat failcheck.cpp
...

int main()
{
        // Stuff that needs to compile
        // or declarations needed
        ...

        // Errors to be detected, one in each clause
#ifdef ERROR_A01 // no matching function for call
        ...
#elif ERROR_A02 // constructor is private
        ...
#elif ERROR_A03 // <whatever, comment will be printed during test>
        ...
#endif

}

$

Then the following little script:

$ cat failcheck.sh

echo
echo "trying without error emulation"

g++ -Wall -DDEBUG -o failcheck failcheck.cpp || {
        echo;
        echo "*** ERROR: compilation doesn't succeeded at all ***";
        echo;
        kill $$;
        exit 1;
}

cat failcheck.cpp \
| grep -e '^#ifdef' -e '^#elif' \
| awk '$2~/ERROR/{$1=""; print}' \
| while read label comment
do
        echo
        echo "trying $label: $comment"
        g++ -Wall -D${label} -DDEBUG -o failcheck failcheck.cpp && {
                echo;
                echo "*** ERROR: compilation succeeded for $label ***";
                echo;
                kill $$;
                exit 1;
        }
done

echo
echo "*** FAILCHECK OK ***"
echo

$

The script scans the sample programme for test cases and tries to
compile it with one test activate at a time. If a compilation succeeds,
the test is aborted with an error message. (Note the kill command!
Piping into a while loop causes the loop body to be executed in a
subshell, so just exiting wouldn't be enough, you need to kill the
parent process.)

You don't need a different source files for each error, just a different
clause. Make sure, however, that there's only one error per clause and
that each label occurs only once. (The script should probably check
this, maybe in the next version :-)

Andreas


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk