Boost logo

Boost :

Subject: [boost] [test]redefinition of boost::unit_test::ut_detail::auto_test_unit_registrar
From: Takatoshi Kondo (redboltz_at_[hidden])
Date: 2017-02-13 14:39:50


Hello,

I'm using Boost.Test.

When I define BOOST_AUTO_TEST_SUITE, I got a compile error
'redefinition of
boost::unit_test::ut_detail::auto_test_unit_registrar' if the all
following conditions are satisfied:

1. The test suite names are the same.
2. BOOST_AUTO_TEST_SUITE are defined in different files.
3. The files are included by one file.
4. BOOST_AUTO_TEST_SUITE are defined at the same line number.

For example,

main.cpp

#define BOOST_TEST_MODULE test
#include <boost/test/unit_test.hpp>

#include "one.ipp"
#include "two.ipp"

one.ipp

BOOST_AUTO_TEST_SUITE(a)
    BOOST_AUTO_TEST_CASE(tc1) {
    }
BOOST_AUTO_TEST_SUITE_END()

two.ipp

BOOST_AUTO_TEST_SUITE(a)
    BOOST_AUTO_TEST_CASE(tc2) {
    }
BOOST_AUTO_TEST_SUITE_END()

Here is a live demo:
http://melpon.org/wandbox/permlink/R459VQ6apnQfapyw

If I insert a line the top of two.ipp, no errors are occurred.

http://melpon.org/wandbox/permlink/jPRTstNDVb7agjXl

According to the following document
http://www.boost.org/doc/libs/1_63_0/libs/test/doc/html/boost_test/tests_organization/test_suite.html#ref_BOOST_AUTO_TEST_SUITE

"The same test suite can be restarted multiple times inside the same
test file or in a different test files."

The compile error is caused by the following line:
https://github.com/boostorg/test/blob/develop/include/boost/test/unit_test_suite.hpp#L326

If I replace
BOOST_JOIN( BOOST_JOIN( test_name, _registrar ), __LINE__ ) \
with
BOOST_JOIN( BOOST_JOIN( test_name, _registrar ), __COUNTER__ ) \
, then the error is disappeared.

However, __COUNTER__ is not portable.

I know that I can compile one.ipp and two.ipp separately, but I also
want to have the option that include them from one file.

Is there any good way to solve the error?

Thanks,
Takatoshi Kondo


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