[Lldb-commits] [lldb] [LLDB] Add array subscription and integer parsing to DIL (PR #141102)

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Fri May 23 00:38:04 PDT 2025


================
@@ -0,0 +1,119 @@
+"""
+Test DIL array subscript.
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+from lldbsuite.test import lldbutil
+
+
+class TestFrameVarDILArraySubscript(TestBase):
+    NO_DEBUG_INFO_TESTCASE = True
+
+    def expect_var_path(self, expr, compare_to_framevar=False, value=None, type=None):
+        value_dil = super().expect_var_path(expr, value=value, type=type)
+        if compare_to_framevar:
+            self.runCmd("settings set target.experimental.use-DIL false")
+            value_frv = super().expect_var_path(expr, value=value, type=type)
+            self.runCmd("settings set target.experimental.use-DIL true")
+            self.assertEqual(value_dil.GetValue(), value_frv.GetValue())
+
+    def test_subscript(self):
+        self.build()
+        lldbutil.run_to_source_breakpoint(
+            self, "Set a breakpoint here", lldb.SBFileSpec("main.cpp")
+        )
+
+        self.runCmd("settings set target.experimental.use-DIL true")
+
+        # Test int[] and int*
+        self.expect_var_path("int_arr[0]", True, value="1")
+        self.expect_var_path("int_ptr[1]", True, value="2")
+        self.expect("frame var 'int_arr[enum_one]'", error=True)
+
+        # Test when base and index are references.
+        self.expect_var_path("int_arr[0]", True, value="1")
+        self.expect("frame var 'int_arr[idx_1_ref]'", error=True)
+        self.expect("frame var 'int_arr[enum_ref]'", error=True)
+        self.expect_var_path("int_arr_ref[0]", value="1")
+        self.expect("frame var 'int_arr_ref[idx_1_ref]'", error=True)
+        self.expect("frame var 'int_arr_ref[enum_ref]'", error=True)
+
+        # Test when base and index are typedefs.
+        self.expect_var_path("td_int_arr[0]", True, value="1")
+        self.expect("frame var 'td_int_arr[td_int_idx_1]'", error=True)
+        self.expect("frame var 'td_int_arr[td_td_int_idx_2]'", error=True)
+        self.expect_var_path("td_int_ptr[0]", True, value="1")
+        self.expect("frame var 'td_int_ptr[td_int_idx_1]'", error=True)
+        self.expect("frame var 'td_int_ptr[td_td_int_idx_2]'", error=True)
+
+        # Both typedefs and refs
+        self.expect("frame var 'td_int_arr_ref[td_int_idx_1_ref]'", error=True)
+
+        # Test for index out of bounds.
+        self.expect_var_path("int_arr[42]", True, type="int")
+        self.expect_var_path("int_arr[100]", True, type="int")
+
+        # Test address-of of the subscripted value.
+        self.expect_var_path("*(&int_arr[1])", value="2")
+
+        # Test for negative index.
+        self.expect(
+            "frame var 'int_arr[-1]'",
+            error=True,
+            substrs=["unrecognized token"],
+        )
+
+        # Test for floating point index
+        self.expect(
+            "frame var 'int_arr[1.0]'",
+            error=True,
+            substrs=["unrecognized token"],
+        )
+
+        # Base should be a "pointer to T" and index should be of an integral type.
+        self.expect(
+            "frame var 'idx_1[0]'",
+            error=True,
+            substrs=["subscripted value is not an array or pointer"],
+        )
+        self.expect(
+            "frame var 'idx_1_ref[0]'",
+            error=True,
+            substrs=["subscripted value is not an array or pointer"],
+        )
+        self.expect(
+            "frame var 'int_arr[int_ptr]'",
+            error=True,
+            substrs=["failed to parse integer constant"],
+        )
+        self.expect(
+            "frame var '1[2]'",
+            error=True,
+            substrs=["Unexpected token"],
+        )
+
+        # Base should not be a pointer to void
+        self.expect(
+            "frame var 'p_void[0]'",
+            error=True,
+            substrs=["subscript of pointer to incomplete type 'void'"],
+        )
+
+    @skipIf(oslist=["windows"], archs=["aarch64"])
----------------
labath wrote:

```suggestion
    @expectedFailureAll(oslist=["windows"])
```

I doubt this is specific to aarch64. It just happens we have no other bot around. And lets use xfail so we know to re-enable this when it gets fixed.

https://github.com/llvm/llvm-project/pull/141102


More information about the lldb-commits mailing list