""" Test lldb-mi -stack-list-locals -stack-list-variables and -var-create commands for variables with the same name in sibling lexical scopes. """ from __future__ import print_function import lldbmi_testcase from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class MiLexicalScopeTestCase(lldbmi_testcase.MiTestCaseBase): mydir = TestBase.compute_mydir(__file__) @skipIfWindows # llvm.org/pr24452: Get lldb-mi tests working on Windows @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races @skipIfRemote # We do not currently support remote debugging via the MI. def test_lldbmi_var_create_in_sibling_scope(self): """Test that 'lldb-mi --interpreter' works with sibling lexical scopes.""" self.spawnLldbMi(args=None) # Load executable self.runCmd("-file-exec-and-symbols %s" % self.myexe) self.expect("\^done") # Breakpoint inside first scope line = line_number('main.cpp', '// BP_first') self.runCmd("-break-insert --file main.cpp:%d" % line) self.expect("\^done,bkpt={number=\"\d+\"") # Breakpoint inside second scope line = line_number('main.cpp', '// BP_second') self.runCmd("-break-insert --file main.cpp:%d" % line) self.expect("\^done,bkpt={number=\"\d+\"") # Run to the first scope self.runCmd("-exec-run") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") # Check that only variables a and b exist with expected values self.runCmd("-stack-list-locals --thread 1 --frame 0 --all-values") self.expect("\^done,locals=\[{name=\"a\",value=\"1\"},{name=\"b\",value=\"2\"}\]") # Create variable object for local variable b self.runCmd("-var-create - * \"b\"") self.expect( "\^done,name=\"var\d+\",numchild=\"0\",value=\"2\",type=\"int\",thread-id=\"1\",has_more=\"0\"") # Run to the second scope self.runCmd("-exec-continue") self.expect("\^running") self.expect("\*stopped,reason=\"breakpoint-hit\"") # Check that only variables a and b exist with expected values, # but variable b is different from previous breakpoint self.runCmd("-stack-list-variables --thread 1 --frame 0 --all-values") self.expect("\^done,variables=\[{name=\"a\",value=\"1\"},{name=\"b\",value=\"3\"}\]") # Create variable object for local variable b self.runCmd("-var-create - * \"b\"") self.expect( "\^done,name=\"var\d+\",numchild=\"0\",value=\"3\",type=\"short\",thread-id=\"1\",has_more=\"0\"")