]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: add testcase for invalid record display
authorKévin Le Gouguec <legouguec@adacore.com>
Thu, 4 Jul 2024 06:45:01 +0000 (08:45 +0200)
committerKévin Le Gouguec <legouguec@adacore.com>
Thu, 11 Jul 2024 09:48:29 +0000 (11:48 +0200)
More of a DWARF-generation non-regression test; fixed on the GCC side
with 2024-06-03 "Implement wrap-around arithmetics in DWARF
expressions" (f3d6d60d2ae).

Approved-By: Tom Tromey <tom@tromey.com>
gdb/testsuite/gdb.ada/variant_record_field.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/variant_record_field/foo.adb [new file with mode: 0644]

diff --git a/gdb/testsuite/gdb.ada/variant_record_field.exp b/gdb/testsuite/gdb.ada/variant_record_field.exp
new file mode 100644 (file)
index 0000000..f3baa25
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright 2024 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+require allow_ada_tests
+
+standard_ada_testfile foo
+
+# The compiler used to emit an invalid DWARF expression for the record
+# size, so GDB could not 'print p_record' correctly: a direct 'print
+# p_record.i' worked, but iteration over the record fields was broken.
+#
+# Originally observed at -O2, and the bug was reproducible with just
+# -Og.  The DWARF fix covered both optimization levels; not worth
+# making guarantees beyond -Og though, so test that.
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug optimize=-Og]] != ""} {
+  return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "BREAK" ${srcfile}]
+runto "${testfile}.adb:${bp_location}"
+
+set test "print p_record"
+gdb_test_multiple "$test" "$test" {
+    -re "\\(kind => five, i => 1200\\)" {
+       pass $test
+    }
+    -re "\\(kind => five, i => <error reading variable: access outside bounds of object>" {
+       if { [gcc_major_version] <= 14 } {
+           setup_xfail *-*-*
+       }
+       fail $test
+    }
+}
diff --git a/gdb/testsuite/gdb.ada/variant_record_field/foo.adb b/gdb/testsuite/gdb.ada/variant_record_field/foo.adb
new file mode 100644 (file)
index 0000000..2526a1d
--- /dev/null
@@ -0,0 +1,47 @@
+--  Copyright 2024 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+with Ada.Text_IO;
+
+procedure Foo is
+
+   package P is
+
+      type Int16 is range 0 .. 2 ** 16 - 1;
+      type Enum is (Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine);
+
+      type Rec (Kind : Enum := Zero) is record
+         case Kind is
+            when Four .. Seven =>
+               I : Int16;
+            when others =>
+               null;
+         end case;
+      end record;
+
+   end P;
+
+   P_Record : P.Rec;
+   I : P.Int16;
+
+   procedure Dump is
+   begin
+      Ada.Text_IO.Put_Line ("P_Record.I => " & P_Record.I'Image); -- BREAK
+   end Dump;
+
+begin
+   I := P.Int16'(1200);
+   P_Record := (Kind => P.Five, I => I);
+   Dump;
+end Foo;