From: Tom Tromey Date: Thu, 8 Sep 2022 16:35:09 +0000 (-0600) Subject: Add test case for "finish" with variably-sized types X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a7d5fcaf8e15820f997ba7774a8eef7ab7e2f2e3;p=binutils-gdb.git Add test case for "finish" with variably-sized types This adds a test case for "finish" with variably-sized types, and for inferior calls as well. This also extends the "runto" proc to handle temporary breakpoints. --- diff --git a/gdb/testsuite/gdb.ada/finish-var-size.exp b/gdb/testsuite/gdb.ada/finish-var-size.exp new file mode 100644 index 00000000000..aab3fd6474e --- /dev/null +++ b/gdb/testsuite/gdb.ada/finish-var-size.exp @@ -0,0 +1,43 @@ +# Copyright 2022 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 . + +load_lib "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +# GCC 12 has the needed fix. +if {![test_compiler_info {gcc-1[2-9]-*}]} { + untested "GCC too told for this test" + return -1 +} + +standard_ada_testfile p + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} { + return -1 +} + +clean_restart ${testfile} +runto "pck.get" temporary + +set value [string_to_regexp "= (defined => true, payload => true)"] + +# With some ABIs the return value cannot be determined. Accept this, +# or the correct result. +gdb_test "finish" \ + "Value returned .*($value|Cannot determine contents)" + +# Test that an inferior call yields the correct result. +gdb_test "print pck.get(True)" $value diff --git a/gdb/testsuite/gdb.ada/finish-var-size/p.adb b/gdb/testsuite/gdb.ada/finish-var-size/p.adb new file mode 100644 index 00000000000..33d7b4895b4 --- /dev/null +++ b/gdb/testsuite/gdb.ada/finish-var-size/p.adb @@ -0,0 +1,21 @@ +-- Copyright 2022 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 . + +with Pck; use Pck; +procedure P is + V : Result_T := Get (True); +begin + null; +end P; diff --git a/gdb/testsuite/gdb.ada/finish-var-size/pck.adb b/gdb/testsuite/gdb.ada/finish-var-size/pck.adb new file mode 100644 index 00000000000..884cf9160fd --- /dev/null +++ b/gdb/testsuite/gdb.ada/finish-var-size/pck.adb @@ -0,0 +1,21 @@ +-- Copyright 2022 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 . + +package body Pck is + function Get (Value: Boolean) return Result_T is + begin + return (Defined => True, Payload => Value); + end Get; +end Pck; diff --git a/gdb/testsuite/gdb.ada/finish-var-size/pck.ads b/gdb/testsuite/gdb.ada/finish-var-size/pck.ads new file mode 100644 index 00000000000..d6fcbfa1f1d --- /dev/null +++ b/gdb/testsuite/gdb.ada/finish-var-size/pck.ads @@ -0,0 +1,36 @@ +-- Copyright 2022 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 . + +package Pck is + type Array_Type is array (1 .. 64) of Integer; + + type Maybe_Array (Defined : Boolean := False) is + record + Arr : Array_Type; + Arr2 : Array_Type; + end record; + + type Result_T (Defined : Boolean := False) is + record + case Defined is + when False => + Arr : Maybe_Array; + when True => + Payload : Boolean; + end case; + end record; + + function Get (Value: Boolean) return Result_T; +end Pck; diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index f94ec1b77f3..135ace68d5e 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -743,13 +743,13 @@ proc runto { linespec args } { # the "at foo.c:36" output we get with -g. # the "in func" output we get without -g. gdb_expect 30 { - -re "Break.* at .*:$decimal.*$gdb_prompt $" { + -re "(?:Break|Temporary break).* at .*:$decimal.*$gdb_prompt $" { if { $print_pass } { pass $test_name } return 1 } - -re "Breakpoint $bkptno_numopt_re, \[0-9xa-f\]* in .*$gdb_prompt $" { + -re "(?:Breakpoint|Temporary breakpoint) $bkptno_numopt_re, \[0-9xa-f\]* in .*$gdb_prompt $" { if { $print_pass } { pass $test_name }