Blame SOURCES/gdb-flexible-array-member-expected-pattern.patch

405ea9
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
405ea9
From: Simon Marchi <simon.marchi@efficios.com>
405ea9
Date: Tue, 4 May 2021 11:20:09 -0400
405ea9
Subject: gdb-flexible-array-member-expected-pattern.patch
405ea9
405ea9
;; Backport "adjust gdb.python/flexible-array-member.exp expected pattern"
405ea9
;; (Simon Marchi)
405ea9
405ea9
The `Type.range ()` tests in gdb.python/flexible-array-member.exp pass
405ea9
when the test is compiled with gcc 9 or later, but not with gcc 8 or
405ea9
earlier:
405ea9
405ea9
    $ make check TESTS="gdb.python/flexible-array-member.exp" RUNTESTFLAGS="CC_FOR_TARGET='gcc-8'"
405ea9
405ea9
    python print(zs['items'].type.range())^M
405ea9
    (0, 0)^M
405ea9
    (gdb) FAIL: gdb.python/flexible-array-member.exp: python print(zs['items'].type.range())
405ea9
    python print(zso['items'].type.range())^M
405ea9
    (0, 0)^M
405ea9
    (gdb) FAIL: gdb.python/flexible-array-member.exp: python print(zso['items'].type.range())
405ea9
405ea9
The value that we get for the upper bound of a flexible array member
405ea9
declared with a "0" size is 0 with gcc <= 8 and is -1 for gcc >= 9.
405ea9
This is due to different debug info.  For this member, gcc 8 does:
405ea9
405ea9
    0x000000d5:   DW_TAG_array_type
405ea9
                    DW_AT_type [DW_FORM_ref4]       (0x00000034 "int")
405ea9
                    DW_AT_sibling [DW_FORM_ref4]    (0x000000e4)
405ea9
405ea9
    0x000000de:     DW_TAG_subrange_type
405ea9
                      DW_AT_type [DW_FORM_ref4]     (0x0000002d "long unsigned int")
405ea9
405ea9
For the same type, gcc 9 does:
405ea9
405ea9
    0x000000d5:   DW_TAG_array_type
405ea9
                    DW_AT_type [DW_FORM_ref4]       (0x00000034 "int")
405ea9
                    DW_AT_sibling [DW_FORM_ref4]    (0x000000e5)
405ea9
405ea9
    0x000000de:     DW_TAG_subrange_type
405ea9
                      DW_AT_type [DW_FORM_ref4]     (0x0000002d "long unsigned int")
405ea9
                      DW_AT_count [DW_FORM_data1]   (0x00)
405ea9
405ea9
Ideally, GDB would present a consistent and documented value for an
405ea9
array member declared with size 0, regardless of how the debug info
405ea9
looks like.  But for now, just change the test to accept the two
405ea9
values, to get rid of the failure and make the test in sync
405ea9
405ea9
I also realized (by looking at the py-type.exp test) that calling the
405ea9
fields method on an array type yields one field representing the "index"
405ea9
of the array.  The type of that field is of type range
405ea9
(gdb.TYPE_CODE_RANGE).  When calling `.range()` on that range type, it
405ea9
yields the same range tuple as when calling `.range()` on the array type
405ea9
itself.  For completeness, add some tests to access the range tuple
405ea9
through that range type as well.
405ea9
405ea9
gdb/testsuite/ChangeLog:
405ea9
405ea9
	* gdb.python/flexible-array-member.exp: Adjust expected range
405ea9
	value for member declared with 0 size.  Test accessing range
405ea9
	tuple through range type.
405ea9
405ea9
Change-Id: Ie4e06d99fe9315527f04577888f48284d649ca4c
405ea9
405ea9
diff --git a/gdb/testsuite/gdb.python/flexible-array-member.exp b/gdb/testsuite/gdb.python/flexible-array-member.exp
405ea9
--- a/gdb/testsuite/gdb.python/flexible-array-member.exp
405ea9
+++ b/gdb/testsuite/gdb.python/flexible-array-member.exp
405ea9
@@ -76,9 +76,17 @@ gdb_test "python print(zso\['items'\] == zso\['items'\]\[0\].address)" "True"
405ea9
 gdb_test "python print(zso\['items'\]\[0\].address + 1 == zso\['items'\]\[1\].address)" "True"
405ea9
 
405ea9
 # Verify the range attribute.  It looks a bit inconsistent that the high bound
405ea9
-# is sometimes 0, sometimes -1, but that's what GDB produces today, so that's
405ea9
-# what we test.
405ea9
+# is sometimes 0, sometimes -1.  It depends on the way the flexible array
405ea9
+# member is specified and on the compiler version (the debug info is
405ea9
+# different).  But that's what GDB produces today, so that's what we test.
405ea9
 
405ea9
 gdb_test "python print(ns\['items'\].type.range())" "\\(0, 0\\)"
405ea9
-gdb_test "python print(zs\['items'\].type.range())" "\\(0, -1\\)"
405ea9
-gdb_test "python print(zso\['items'\].type.range())" "\\(0, -1\\)"
405ea9
+gdb_test "python print(zs\['items'\].type.range())" "\\(0, (0|-1)\\)"
405ea9
+gdb_test "python print(zso\['items'\].type.range())" "\\(0, (0|-1)\\)"
405ea9
+
405ea9
+# Test the same thing, but going explicitly through the array index's range
405ea9
+# type.
405ea9
+
405ea9
+gdb_test "python print(ns\['items'\].type.fields()\[0\].type.range())" "\\(0, 0\\)"
405ea9
+gdb_test "python print(zs\['items'\].type.fields()\[0\].type.range())" "\\(0, (0|-1)\\)"
405ea9
+gdb_test "python print(zso\['items'\].type.fields()\[0\].type.range())" "\\(0, (0|-1)\\)"