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

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