Bug 15102

Summary: dwarf/regression: array index treated as signed byte, when specified unsigned byte (leads to [0..-n])
Product: gdb Reporter: Martin <gdb.bugs>
Component: gdbAssignee: Tom Tromey <tromey>
Status: RESOLVED FIXED    
Severity: normal CC: tromey
Priority: P2    
Version: 7.5   
Target Milestone: 7.6   
Host: Target:
Build: Last reconfirmed:

Description Martin 2013-02-05 19:17:25 UTC
This issue is present in GDB 7.3, gdb 7.4, gdb 7.5
It was not present in 7.2

Compile using free-pascal (-gw creates dwarf 2)
   fpc.exe -gw Array.pas

program Foo;
type TByteArray = array[0..191] of integer;
var a: TByteArray;
begin
  a[1] := 0;
end.

execute in gdb:
  ptype TByteArray

type = array [0..-65] of SMALLINT

But it should be 0..191

OBJDUMP -w shows

 <2><95>: Abbrev Number: 6 (DW_TAG_subrange_type)
    <96>   DW_AT_lower_bound : 0
    <97>   DW_AT_upper_bound : 191
    <99>   DW_AT_stride      : 2
    <9a>   DW_AT_type        : <0xc3>

 <1><c3>: Abbrev Number: 4 (DW_TAG_typedef)
    <c4>   DW_AT_name        : BYTE
    <c9>   DW_AT_type        : <0xcd>
 <1><cd>: Abbrev Number: 8 (DW_TAG_base_type)
    <ce>   DW_AT_name        : BYTE
    <d3>   DW_AT_encoding    : 7        (unsigned)
    <d4>   DW_AT_byte_size   : 1


The basetype is clearly marked unsigned.
Comment 1 Tom Tromey 2013-02-06 12:52:58 UTC
Testing a patch.

The bug is that the subrange type code in dwarf2read.c
doesn't strip typedefs, so it doesn't see that the range
type is unsigned.
Comment 2 Sourceware Commits 2013-02-18 21:04:34 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	tromey@sourceware.org	2013-02-18 21:04:28

Modified files:
	gdb            : ChangeLog dwarf2read.c 
	gdb/testsuite  : ChangeLog 
Added files:
	gdb/testsuite/gdb.dwarf2: subrange.exp 

Log message:
	PR gdb/15102:
	* dwarf2read.c (read_subrange_type): Use result of
	'check_typedef'.
	gdb/testsuite
	* gdb.dwarf2/subrange.exp: New file.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/ChangeLog.diff?cvsroot=src&r1=1.15160&r2=1.15161
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/dwarf2read.c.diff?cvsroot=src&r1=1.753&r2=1.754
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/ChangeLog.diff?cvsroot=src&r1=1.3564&r2=1.3565
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gdb/testsuite/gdb.dwarf2/subrange.exp.diff?cvsroot=src&r1=NONE&r2=1.1
Comment 3 Tom Tromey 2013-02-18 21:06:28 UTC
Fixed.