[Boost][Test] Compile error with BOOST_REQUIRE_THROW
Hi, I've just found that we have a compiler error when using the BOOST_REQUIRE_THROW macro in a if/else statement with implicit block. Let's have an example: BOOST_AUTO_TEST_CASE(foo) { if(true) BOOST_REQUIRE_THROW(throw std::exception(), std::exception); else BOOST_REQUIRE_THROW(throw std::exception(), std::exception); } Will fail with: file.cpp: In member function ‘void foo::test_method()’: file.cpp:184:2: error: ‘else’ without a previous ‘if’ To make it work, we need to put explicit block: BOOST_AUTO_TEST_CASE(foo) { if(true) { BOOST_REQUIRE_THROW(throw std::exception(), std::exception); } else { BOOST_REQUIRE_THROW(throw std::exception(), std::exception); } } Wouldn't it be possible to add this block in the macro so library users don't have to care about? PS: Sorry for my writing, I'm not a native English speaker. -- Martin Desharnais martin.desharnais@gmail.com
[Please do not mail me a copy of your followup] boost-users@lists.boost.org spake the secret code <4E583EC5.7080700@gmail.com> thusly:
I've just found that we have a compiler error when using the BOOST_REQUIRE_THROW macro in a if/else statement with implicit block. Let's have an example:
BOOST_AUTO_TEST_CASE(foo) { if(true) BOOST_REQUIRE_THROW(throw std::exception(), std::exception); else BOOST_REQUIRE_THROW(throw std::exception(), std::exception); }
Will fail with:
file.cpp: In member function ‘void foo::test_method()’: file.cpp:184:2: error: ‘else’ without a previous ‘if’
BOOST_REQUIRE_THROW expands into a try { ... } catch { ... } block. Such a block is a valid single statement, but if you put a ; at the end of the catch block, that semicolon terminates the if statement. If you want to write code this way, then don't put a semicolon after the BOOST_REQUIRE_THROW macro.
To make it work, we need to put explicit block:
That's one way to make it work, and its one reason why always using {}s for control structures is recommended when those control structures contain macros.
Wouldn't it be possible to add this block in the macro so library users don't have to care about?
The macro could be enclosed in a do { .... } while (0) construct in order to make it syntactically appear more like a single statement that is terminated with a semicolon. File a bug report on the boost bug tracker. -- "The Direct3D Graphics Pipeline" -- DirectX 9 draft available for download http://legalizeadulthood.wordpress.com/the-direct3d-graphics-pipeline/ Legalize Adulthood! http://legalizeadulthood.wordpress.com
participants (2)
-
legalize+jeeves@mail.xmission.com
-
Martin Desharnais