Normalize Ada ptype to use a single "?"

Sometimes -- notably with unchecked unions -- the Ada "ptype" code
will print a "?" or "??" to indicate something unknown.  The choice of
what was printed was somewhat arbitrary, and in one case, Ada would
print an empty string rather than "?".

This patch normalizes the Ada code to use "?" rather than an empty
string or "??".  My reasoning here is that a single question mark is
enough to convey unknown-ness.

gdb/ChangeLog
2019-12-10  Tom Tromey  <tromey@adacore.com>

	* ada-typeprint.c (print_choices): Use a single "?".
	(print_variant_part): Print "?" if the discriminant name
	is not known.

gdb/testsuite/ChangeLog
2019-12-10  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/unchecked_union.exp: New file.
	* gdb.ada/unchecked_union/pck.adb: New file.
	* gdb.ada/unchecked_union/pck.ads: New file.
	* gdb.ada/unchecked_union/unchecked_union.adb: New file.
	* gdb-utils.exp (string_to_regexp): Also quote "?".

Change-Id: I3403040780a155ffa2c44c8e6a04ba86bc810e29
This commit is contained in:
Tom Tromey
2019-12-03 13:31:21 -07:00
parent 0a0a052176
commit 6c71eb7d70
8 changed files with 171 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2019-12-10 Tom Tromey <tromey@adacore.com>
* ada-typeprint.c (print_choices): Use a single "?".
(print_variant_part): Print "?" if the discriminant name
is not known.
2019-12-10 George Barrett <bob@bob131.so>
Fix scripted probe breakpoints.

View File

@ -526,7 +526,7 @@ print_choices (struct type *type, int field_num, struct ui_file *stream,
}
Huh:
fprintf_filtered (stream, "?? =>");
fprintf_filtered (stream, "? =>");
return 0;
}
@ -592,9 +592,12 @@ print_variant_part (struct type *type, int field_num, struct type *outer_type,
struct ui_file *stream, int show, int level,
const struct type_print_options *flags)
{
fprintf_filtered (stream, "\n%*scase %s is", level + 4, "",
ada_variant_discrim_name
(TYPE_FIELD_TYPE (type, field_num)));
const char *variant
= ada_variant_discrim_name (TYPE_FIELD_TYPE (type, field_num));
if (*variant == '\0')
variant = "?";
fprintf_filtered (stream, "\n%*scase %s is", level + 4, "", variant);
print_variant_clauses (type, field_num, outer_type, stream, show,
level + 4, flags);
fprintf_filtered (stream, "\n%*send case;", level + 4, "");

View File

@ -1,3 +1,11 @@
2019-12-10 Tom Tromey <tromey@adacore.com>
* gdb.ada/unchecked_union.exp: New file.
* gdb.ada/unchecked_union/pck.adb: New file.
* gdb.ada/unchecked_union/pck.ads: New file.
* gdb.ada/unchecked_union/unchecked_union.adb: New file.
* gdb-utils.exp (string_to_regexp): Also quote "?".
2019-12-10 George Barrett <bob@bob131.so>
Test scripted probe breakpoints.

View File

@ -0,0 +1,58 @@
# Copyright 2019 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/>.
# Test ptype of an unchecked union.
load_lib "ada.exp"
standard_ada_testfile unchecked_union
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
return -1
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "BREAK" ${testdir}/unchecked_union.adb]
runto "unchecked_union.adb:$bp_location"
proc multi_line_string {str} {
set result {}
foreach line [split $str \n] {
lappend result [string_to_regexp $line]
}
return [eval multi_line $result]
}
set inner_string { case ? is
when ? =>
small: range 0 .. 255;
when ? =>
large: range 255 .. 510;
end case;
}
set inner_full "type = record (?) is\n${inner_string}end record"
set pair_string { case ? is
when ? =>
field_one: range 0 .. 255;
when ? =>
field_two: range 255 .. 510;
end case;
}
set pair_full "type = record\n${inner_string}${pair_string}end record"
gdb_test "ptype Pair" [multi_line_string $pair_full]
gdb_test "ptype Inner" [multi_line_string $inner_full]

View File

@ -0,0 +1,21 @@
-- Copyright 2019 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/>.
package body Pck is
procedure Do_Nothing (A : System.Address) is
begin
null;
end Do_Nothing;
end Pck;

View File

@ -0,0 +1,19 @@
-- Copyright 2019 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 System;
package Pck is
procedure Do_Nothing (A : System.Address);
end Pck;

View File

@ -0,0 +1,51 @@
-- Copyright 2019 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 System;
with Pck; use Pck;
procedure Foo is
type Key is (Alpha, Omega);
type Inner(Disc : Key := Omega) is record
case Disc is
when Alpha =>
Small : Integer range 0..255;
when others =>
Large : Integer range 255..510;
end case;
end record;
pragma Unchecked_Union (Inner);
type Outer(Disc : Key := Alpha) is record
case Disc is
when Alpha =>
Field_One : Integer range 0..255;
when others =>
Field_Two : Integer range 255..510;
end case;
end record;
pragma Unchecked_Union (Outer);
type Pair is record
Pone : Inner;
Ptwo : Outer;
end record;
Value : Pair;
begin
Do_Nothing (Value'Address); -- BREAK
end Foo;

View File

@ -34,7 +34,7 @@ proc gdb_init_commands {} {
proc string_to_regexp {str} {
set result $str
regsub -all {[]*+.|(){}^$\[\\]} $str {\\&} result
regsub -all {[]?*+.|(){}^$\[\\]} $str {\\&} result
return $result
}