-
Notifications
You must be signed in to change notification settings - Fork 37.7k
Closed
Labels
Description
The Assert
/Assume
macros are implemented via lambda functions to allow the result of the assertion to both be evaluated (and trigger an abort) and be returned without having the expression be evaluated twice.
This causes some ugly namespacing issues though. Because there's a function call, clang's thread safety annotations don't get passed through (as the lambda is unannotated), possibly causing an unnecessary compiler error because the compiler loses track that a mutex is held when a guarded variable is accessed.
It also seems that gcc (but not clang) gets confused about member functions (but not member variables), eg:
class TestAssert
{
public:
int variable = 3;
int test_1(void) { return variable; }
int test_2(void) {
auto x = [&]() {
Assert(test_1() == 3);
};
x();
return ++variable;
}
};
results in:
test/util_tests.cpp:91:26: error: cannot call member function ‘int util_tests::TestAssert::test_1()’ without object
91 | Assert(test_1() == 3);
requiring you to write Assert(this->test_1() == 3)
instead.