Index: packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/Makefile =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/Makefile +++ packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules Index: packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/TestMiLexicalScope.py =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/TestMiLexicalScope.py +++ packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/TestMiLexicalScope.py @@ -0,0 +1,68 @@ +""" +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\"") Index: packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/main.cpp =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/main.cpp +++ packages/Python/lldbsuite/test/tools/lldb-mi/lexical_scope/main.cpp @@ -0,0 +1,33 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +void +some_func (void) +{ +} + +void test_sibling_scope (void) +{ + int a = 1; + { + int b = 2; + some_func(); // BP_first + } + { + short b = 3; + some_func(); // BP_second + } +} + +int +main (int argc, char **argv) +{ + test_sibling_scope(); + return 0; +} Index: tools/lldb-mi/MICmdCmdStack.cpp =================================================================== --- tools/lldb-mi/MICmdCmdStack.cpp +++ tools/lldb-mi/MICmdCmdStack.cpp @@ -757,7 +757,8 @@ : thread.GetSelectedFrame(); CMICmnMIValueList miValueList(true); - const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Locals; + const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Locals | + CMICmnLLDBDebugSessionInfo::eVariableType_InScope; if (!rSessionInfo.MIResponseFormVariableInfo(frame, maskVarTypes, eVarInfoFormat, miValueList)) return MIstatus::failure; @@ -929,7 +930,8 @@ CMICmnMIValueList miValueList(true); const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Arguments | - CMICmnLLDBDebugSessionInfo::eVariableType_Locals; + CMICmnLLDBDebugSessionInfo::eVariableType_Locals | + CMICmnLLDBDebugSessionInfo::eVariableType_InScope; if (!rSessionInfo.MIResponseFormVariableInfo( frame, maskVarTypes, eVarInfoFormat, miValueList, 10, true)) return MIstatus::failure; Index: tools/lldb-mi/MICmdCmdVar.cpp =================================================================== --- tools/lldb-mi/MICmdCmdVar.cpp +++ tools/lldb-mi/MICmdCmdVar.cpp @@ -182,7 +182,7 @@ const bool bArgs = true; const bool bLocals = true; const bool bStatics = true; - const bool bInScopeOnly = false; + const bool bInScopeOnly = true; const lldb::SBValueList valueList = frame.GetVariables(bArgs, bLocals, bStatics, bInScopeOnly); value = valueList.GetFirstValueByName(rStrExpression.c_str());