mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-16 23:06:48 +08:00

Printing a multi-dimensional constrained packed array in Ada would not show the correct values. The bug here is that, when decoding the type of such an array, only the innermost dimension's element bitsize would be correct. For outer dimensions, the bitsize must account for the size of each sub-array, but this was not done. This patch fixes the problem by arranging to compute these sizes after decoding the array type. I've included a bit more test case than is strictly necessary -- the current test here was derived from an internal test, and this patch brings the two into sync. gdb/ChangeLog 2020-11-04 Tom Tromey <tromey@adacore.com> * ada-lang.c (recursively_update_array_bitsize): New function. (decode_constrained_packed_array_type): Call it. gdb/testsuite/ChangeLog 2020-11-04 Tom Tromey <tromey@adacore.com> * gdb.ada/enum_idx_packed.exp: Add tests. * gdb.ada/enum_idx_packed/foo.adb: Add variables. * gdb.ada/enum_idx_packed/pck.adb: Add functions. * gdb.ada/enum_idx_packed/pck.ads: Add types, function declarations.
33 lines
1.3 KiB
Ada
33 lines
1.3 KiB
Ada
-- Copyright 2012-2020 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 Pck; use Pck;
|
|
|
|
procedure Foo is
|
|
Full : Full_Table := (False, True, False, True, False);
|
|
Primary : Primary_Table := (False, True, False);
|
|
Cold : Cold_Table := (False, True);
|
|
Small : Small_Table := New_Small_Table (Low => Red, High => Green);
|
|
Multi : Multi_Table := New_Multi_Table (Red, Green, Low, Medium);
|
|
Multi_Multi : Multi_Multi_Table := New_Multi_Multi_Table (1, 2, 1, 7, 1, 10);
|
|
begin
|
|
Do_Nothing (Full'Address); -- STOP
|
|
Do_Nothing (Primary'Address);
|
|
Do_Nothing (Cold'Address);
|
|
Do_Nothing (Small'Address);
|
|
Do_Nothing (Multi'Address);
|
|
Do_Nothing (Multi_Multi'Address);
|
|
end Foo;
|