Opened 11 years ago
Closed 11 years ago
#5818 closed Feature Requests (fixed)
Compile error with BOOST_REQUIRE_THROW
Reported by: | Owned by: | Gennadiy Rozental | |
---|---|---|---|
Milestone: | To Be Determined | Component: | test |
Version: | Boost 1.47.0 | Severity: | Cosmetic |
Keywords: | BOOST_REQUIRE_THROW | Cc: |
Description
I recently post this email on the boost-users mailing list:
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?
And got this answer:
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. [...] 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.
Fixed in trunk