Author: jingham Date: Thu Jul 18 15:21:16 2019 New Revision: 366507 URL: http://llvm.org/viewvc/llvm-project?rev=366507&view=rev Log: Add an expectedFailure test for type finding.
When two .c files define a type of the same name, lldb just picks one and uses it regardless of context. That is not correct. When stopped in a frame in one of the .c files that define this type, it should use that local definition. This commit just adds a test that checks for the correct behavior. It is currently xfailed. Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/ lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/TestUseClosestType.py lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/main.c lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/other.c Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/TestUseClosestType.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/TestUseClosestType.py?rev=366507&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/TestUseClosestType.py (added) +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/TestUseClosestType.py Thu Jul 18 15:21:16 2019 @@ -0,0 +1,56 @@ +""" +If there is a definition of a type in the current +Execution Context's CU, then we should use that type +even if there are other definitions of the type in other +CU's. Assert that that is true. +""" + +from __future__ import print_function + + +import os +import time +import re +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + + +class TestUseClosestType(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + NO_DEBUG_INFO_TESTCASE = True + + @expectedFailureAll(bugnumber="<rdar://problem/53262085>") + def test_use_in_expr(self): + """Use the shadowed type directly, see if we get a conflicting type definition.""" + self.build() + self.main_source_file = lldb.SBFileSpec("main.c") + self.expr_test() + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + + def run_and_check_expr(self, num_children, child_type): + frame = self.thread.GetFrameAtIndex(0) + result = frame.EvaluateExpression("struct Foo *$mine = (struct Foo *) malloc(sizeof(struct Foo)); $mine") + self.assertTrue(result.GetError().Success(), "Failed to parse an expression using a multiply defined type: %s"%(result.GetError().GetCString()), ) + self.assertEqual(result.GetTypeName(), "struct Foo *", "The result has the right typename.") + self.assertEqual(result.GetNumChildren(), num_children, "Got the right number of children") + self.assertEqual(result.GetChildAtIndex(0).GetTypeName(), child_type, "Got the right type.") + + def expr_test(self): + """ Run to a breakpoint in main.c, check that an expression referring to Foo gets the + local three int version. Then run to a breakpoint in other.c and check that an + expression referring to Foo gets the two char* version. """ + + (target, process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + "Set a breakpoint in main", self.main_source_file) + + self.run_and_check_expr(3, "int") + lldbutil.run_to_source_breakpoint(self, "Set a breakpoint in other", lldb.SBFileSpec("other.c")) + self.run_and_check_expr(2, "char *") + Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/main.c URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/main.c?rev=366507&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/main.c (added) +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/main.c Thu Jul 18 15:21:16 2019 @@ -0,0 +1,16 @@ +extern int callme(int input); + +struct Foo { + int a; + int b; + int c; +}; + +int +main(int argc, char **argv) +{ + // Set a breakpoint in main + struct Foo mine = {callme(argc), 10, 20}; + return mine.a; +} + Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/other.c URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/other.c?rev=366507&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/other.c (added) +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/local_types/other.c Thu Jul 18 15:21:16 2019 @@ -0,0 +1,11 @@ +struct Foo { + char *ptr1; + char *ptr2; +}; + +int +callme(int input) +{ + struct Foo myFoo = { "string one", "Set a breakpoint in other"}; + return myFoo.ptr1[0] + myFoo.ptr2[0] + input; +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits