--- /dev/null
+# Copyright 2008 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/>.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+load_lib "ada.exp"
+
+set testdir "packed_tagged"
+set testfile "${testdir}/comp_bug"
+set srcfile ${srcdir}/${subdir}/${testfile}.adb
+set binfile ${objdir}/${subdir}/${testfile}
+
+file mkdir ${objdir}/${subdir}/${testdir}
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
+ return -1
+}
+
+# A convenience function that joins all the arguments together,
+# with a regexp that matches zero-or-more end of lines in between
+# each argument. This function is ideal to write the expected output
+# of a GDB command that generates more than a couple of lines, as
+# this allows us to write each line as a separate string, which is
+# easier to read by a human being.
+
+proc multi_line { args } {
+ return [join $args "\[\r\n\]*"]
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+set bp_location [gdb_get_line_number "STOP" ${testdir}/comp_bug.adb]
+runto "comp_bug.adb:$bp_location"
+
+gdb_test "print x" \
+ "\\(exists => true, value => 10\\)" \
+ "print x"
+
+gdb_test "ptype x" \
+ [multi_line "type = record" \
+ " exists: range false \\.\\. true;" \
+ " case exists is" \
+ " when true =>" \
+ " value: range 0 \\.\\. 255;" \
+ " when others => null;" \
+ " end case;" \
+ "end record" ] \
+ "ptype x"
+
--- /dev/null
+-- Copyright 2008 Free Software Foundation, Inc.\r
+--\r
+-- This program is free software; you can redistribute it and/or modify\r
+-- it under the terms of the GNU General Public License as published by\r
+-- the Free Software Foundation; either version 3 of the License, or\r
+-- (at your option) any later version.\r
+--\r
+-- This program is distributed in the hope that it will be useful,\r
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+-- GNU General Public License for more details.\r
+--\r
+-- You should have received a copy of the GNU General Public License\r
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+\r
+procedure Comp_Bug is\r
+\r
+ type Number_T (Exists : Boolean := False) is\r
+ record\r
+ case Exists is\r
+ when True =>\r
+ Value : Natural range 0 .. 255;\r
+ when False =>\r
+ null;\r
+ end case;\r
+ end record;\r
+ pragma Pack (Number_T);\r
+\r
+ X : Number_T;\r
+ -- brobecker/2007-09-06: At the time when this issue (G904-017) was\r
+ -- reported, the problem only reproduced if the variable was declared\r
+ -- inside a function (in other words, stored on stack). Although\r
+ -- the issue probably still existed when I tried moving this variable\r
+ -- to a package spec, the symptoms inside GDB disappeared.\r
+begin\r
+ X := (Exists => True, Value => 10);\r
+ if X.Exists then -- STOP\r
+ X.Value := X.Value + 1;\r
+ end if;\r
+end Comp_Bug;\r