BOOST_ASSERT_MSG - chunhualiao/public-docs GitHub Wiki

The output is

  • test_insertStatement: ../../../../../src/frontend/SageIII/sageInterface/sageInterface.C:14422: void SageInterface::insertStatement(SgStatement*, SgStatement*, bool, bool): Assertion `(false)&&(err_msg.c_str())' failed.
  • the err_msg does not show up at all! Useless!!

The build error you encountered is caused by a misuse of the BOOST_ASSERT_MSG macro in this line:

BOOST_ASSERT_MSG(false, err_msg);

🔍 Explanation of the Problem

According to the Boost 1.69 documentation and the error trace, BOOST_ASSERT_MSG(expr, msg) expands to:

assert((expr) && (msg));

Here, expr must be a bool, and msg must also be a bool because of the && operator inside assert.

However, your msg is a std::string:

string err_msg = "targetStmt's parent cannot be a " + className + "...";

That leads to this error:

error: no match for ‘operator&&’ (operand types are ‘bool’ and ‘std::string’)

✅ How to Fix It

Use BOOST_FAIL instead, which accepts a std::string or const char* message:

✅ Recommended Fix:

#include <boost/test/floating_point_comparison.hpp> // Or any header that defines BOOST_FAIL

...

BOOST_FAIL(err_msg);

Alternatively, if you're not using Boost's unit testing framework, and BOOST_FAIL is not available in your setup, fall back to:

✅ Alternative Fix (Standard C++):

std::cerr << err_msg << std::endl;
assert(false);

Or better for debugging:

ROSE_ASSERT_MSG(false, err_msg.c_str());

(If ROSE_ASSERT_MSG(bool, const char*) is defined similarly to BOOST_ASSERT_MSG but accepts C-strings.)


💡 Additional Note

It’s good practice to make error messages compile-time safe. Mixing std::string in macros like assert or BOOST_ASSERT_MSG can be risky, since assert() expects an expression evaluable at runtime as a bool.