diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index d539c50602c..ac23eb5938c 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -4149,7 +4149,9 @@ scalar_type_p (struct type *type) } } -/* True iff TYPE is discrete (INT, RANGE, ENUM). */ +/* True iff TYPE is discrete, as defined in the Ada Reference Manual. + This essentially means one of (INT, RANGE, ENUM) -- but note that + "enum" includes character and boolean as well. */ static int discrete_type_p (struct type *type) @@ -4164,6 +4166,7 @@ discrete_type_p (struct type *type) case TYPE_CODE_RANGE: case TYPE_CODE_ENUM: case TYPE_CODE_BOOL: + case TYPE_CODE_CHAR: return 1; default: return 0; diff --git a/gdb/testsuite/gdb.ada/discrete-char.exp b/gdb/testsuite/gdb.ada/discrete-char.exp new file mode 100644 index 00000000000..762b3def4b9 --- /dev/null +++ b/gdb/testsuite/gdb.ada/discrete-char.exp @@ -0,0 +1,42 @@ +# 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 . + +# Tests that require character to be a discrete type. + +load_lib "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +standard_ada_testfile main + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/main.adb] +if {![runto "main.adb:$bp_location"]} then { + perror "Couldn't run ${testfile}" + return +} + +gdb_test_no_output "set print array-indexes on" +gdb_test "print array_value" \ + [string_to_regexp "= (65 'A' => true, 66 'B' => false , 90 'Z' => true)"] + +gdb_test "print character'val(65)" " = 65 'A'" +gdb_test "print character'pos('A')" " = 65" +gdb_test "print character'first" [string_to_regexp " = 0 '\[\"00\"\]'"] diff --git a/gdb/testsuite/gdb.ada/discrete-char/main.adb b/gdb/testsuite/gdb.ada/discrete-char/main.adb new file mode 100644 index 00000000000..4758c3c42d3 --- /dev/null +++ b/gdb/testsuite/gdb.ada/discrete-char/main.adb @@ -0,0 +1,23 @@ +-- 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 . + +procedure Main is + type Letters is new Character range 'A' .. 'Z'; + type Array_Type is array (Letters) of Boolean; + + Array_Value : Array_Type := ('A' => true, 'Z' => true, others => false); +begin + null; -- STOP +end Main;