Depends on: * https://github.com/llvm/llvm-project/pull/177921 * https://github.com/llvm/llvm-project/pull/177926 (only last commit is relevant for this review) This patch emits a workaround suggestion (in the form of a `note:` diagnostic) when an expression fails due to trying to mutate state/call functions with CV-qualifiers that are disallowed by C++ language rules based on the context the expression is evaluated in. The note looks as follows: ``` (lldb) expr next.method() ˄ ╰─ error: 'this' argument to member function 'method' has type 'const Bar', but function is not marked const note: Ran expression as 'C++14'. note: note: 'method' declared here note: Possibly trying to mutate object in a const context. Try running the expression with: expression --c++-ignore-context-qualifiers -- <your expression> ```
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
|
|
class TestCase(TestBase):
|
|
def test(self):
|
|
self.build()
|
|
(_, process, _, _) = lldbutil.run_to_source_breakpoint(
|
|
self, "Break here", lldb.SBFileSpec("main.cpp")
|
|
)
|
|
|
|
self.expect(
|
|
"expression m_bar->method()",
|
|
error=True,
|
|
substrs=[
|
|
"member reference type 'const Bar' is not a pointer",
|
|
"but function is not marked const",
|
|
"Possibly trying to mutate object in a const context. Try running the expression with",
|
|
"expression --c++-ignore-context-qualifiers -- m_bar.method()",
|
|
],
|
|
)
|
|
|
|
# Two fix-its...
|
|
self.expect(
|
|
"expression -- m_bar->method() + m_bar->method()",
|
|
error=True,
|
|
substrs=[
|
|
"member reference type 'const Bar' is not a pointer",
|
|
"but function is not marked const",
|
|
"member reference type 'const Bar' is not a pointer",
|
|
"but function is not marked const",
|
|
],
|
|
)
|
|
|
|
# ...only emit a single hint.
|
|
self.assertEqual(
|
|
self.res.GetError().count(
|
|
"Possibly trying to mutate object in a const context."
|
|
),
|
|
1,
|
|
)
|
|
|
|
self.expect(
|
|
"expression -Q -- m_bar->method()",
|
|
error=True,
|
|
substrs=["Evaluated this expression after applying Fix-It(s):"],
|
|
)
|
|
|
|
self.expect(
|
|
"expression m_bar->method() + blah",
|
|
error=True,
|
|
substrs=[
|
|
"member reference type 'const Bar' is not a pointer",
|
|
"but function is not marked const",
|
|
"Possibly trying to mutate object in a const context. Try running the expression with",
|
|
"expression --c++-ignore-context-qualifiers -- m_bar.method() + blah",
|
|
],
|
|
)
|
|
|
|
self.expect(
|
|
"expression -Q -- m_bar->method() + blah",
|
|
error=True,
|
|
substrs=[
|
|
"Possibly trying to mutate object in a const context. Try running the expression with",
|
|
],
|
|
matching=False,
|
|
)
|