We stopped marking `__lldb_expr` with the function qualifiers of the method LLDB is stopped in ever since `8bdcd522510f923185cdfaec66c4a78d0a0d38c0`. The assumption was that it wasn't ever required for correctness (i.e., LLDB should just always pretend it's in a mutable context). But since function qualifiers affect overloading in C++, this assumption can lead to unexpected expression evaluator behaviour. E.g., if a function is overloaded on qualifiers (`const` vs. `non-const`), the expression evaluator would currently always call the non-CV qualified overload. This patch adds function qualifiers to `$__lldb_class::$__lldb_expr` that resemble the qualifiers of the method that we're stopped in. However, mutating variables or calling arbitrary member functions from CV-qualified methods can be useful/is something users already may be used to. To provide users with the ability to ignore the CV-qualifiers of the current context, we will provide an expression evaluator flag that switches this off in a follow-up patch.
23 lines
255 B
C++
23 lines
255 B
C++
#include <cassert>
|
|
#include <cstdio>
|
|
|
|
struct Bar {
|
|
void method() {}
|
|
};
|
|
|
|
struct Foo {
|
|
int const_method() const {
|
|
std::puts("Break here");
|
|
|
|
return 120;
|
|
}
|
|
|
|
Bar m_bar;
|
|
};
|
|
|
|
int main() {
|
|
Foo{}.m_bar.method();
|
|
|
|
return Foo{}.const_method();
|
|
}
|