id,summary,reporter,owner,description,type,status,milestone,component,version,severity,resolution,keywords,cc 5818,Compile error with BOOST_REQUIRE_THROW,martin.desharnais@…,Gennadiy Rozental,"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.",Feature Requests,closed,To Be Determined,test,Boost 1.47.0,Cosmetic,fixed,BOOST_REQUIRE_THROW,