import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil @skipIfWasm # no expression evaluation class TestCase(TestBase): def test(self): self.build() (_, process, _, _) = lldbutil.run_to_source_breakpoint( self, "Break: const_method begin", lldb.SBFileSpec("main.cpp") ) self.expect_expr("bar()", result_value="2", result_type="int") self.expect( "expression m_const_mem = 2.0", error=True, substrs=[ "note: Possibly trying to mutate object in a const context. Try running the expression with", ], matching=False, ) self.expect( "expression m_mem = 2.0", error=True, substrs=[ "cannot assign to non-static data member within const member function", "note: Possibly trying to mutate object in a const context. Try running the expression with", ], ) self.expect_expr("m_mem", result_value="-2") # Test short and long --c++-ignore-context-qualifiers option. self.expect( "expression --c++-ignore-context-qualifiers -- m_mem = 3.0", error=False, ) self.expect_expr("m_mem", result_value="3") self.expect( "expression -Q -- m_mem = 4.0", error=False, ) self.expect_expr("m_mem", result_value="4") # Test --c++-ignore-context-qualifiers via SBExpressionOptions. options = lldb.SBExpressionOptions() options.SetBooleanLanguageOption("c++-ignore-context-qualifiers", True) self.expect_expr("m_mem = -2.0; m_mem", options=options, result_value="-2") self.expect_expr("((Foo*)this)->bar()", result_type="double", result_value="5") lldbutil.continue_to_source_breakpoint( self, process, "Break: const_method no-this lambda", lldb.SBFileSpec("main.cpp"), ) self.expect( "expression x = 7.0", error=True, substrs=[ "cannot assign to non-static data member within const member function", "note: Possibly trying to mutate object in a const context. Try running the expression with", ], ) self.expect_expr("x", result_value="2") self.expect_expr("x = -5; x", options=options, result_value="-5") lldbutil.continue_to_source_breakpoint( self, process, "Break: const_method mutable no-this lambda", lldb.SBFileSpec("main.cpp"), ) self.expect_expr("x = 7.0; x", result_value="7") lldbutil.continue_to_source_breakpoint( self, process, "Break: const_method lambda", lldb.SBFileSpec("main.cpp") ) # FIXME: mutating this capture should be disallowed in a non-mutable lambda. self.expect_expr("y = 8.0") self.expect_expr("bar()", result_value="2", result_type="int") self.expect( "expression m_const_mem = 2.0", error=True, substrs=[ "note: Possibly trying to mutate object in a const context. Try running the expression with", ], matching=False, ) self.expect( "expression m_mem = 2.0", error=True, substrs=[ "cannot assign to non-static data member within const member function", "note: Possibly trying to mutate object in a const context. Try running the expression with", ], ) self.expect_expr("m_mem", result_value="-2") self.expect_expr("m_mem = -1; m_mem", options=options, result_value="-1") self.expect_expr("((Foo*)this)->bar()", result_type="double", result_value="5") lldbutil.continue_to_source_breakpoint( self, process, "Break: const_method mutable lambda", lldb.SBFileSpec("main.cpp"), ) self.expect_expr("y = 9.0") self.expect_expr("bar()", result_value="2", result_type="int") self.expect( "expression m_const_mem = 2.0", error=True, substrs=[ "note: Possibly trying to mutate object in a const context. Try running the expression with", ], matching=False, ) self.expect( "expression m_mem = 2.0", error=True, substrs=[ "cannot assign to non-static data member within const member function", "note: Possibly trying to mutate object in a const context. Try running the expression with", ], ) self.expect_expr("m_mem", result_value="-1") self.expect_expr("m_mem = -2; m_mem", options=options, result_value="-2")