https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120193
Bug ID: 120193
Summary: Incorrect debug info for unsigned(kind=1) and
unsigned(kind=4)
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: jakub at gcc dot gnu.org
Target Milestone: ---
unsigned(kind=1) :: a(2), e
unsigned(kind=2) :: b(2), f
unsigned(kind=4) :: c(2), g
unsigned(kind=8) :: d(2), h
a = 1u_1
b = 1u_2
c = 1u_4
d = 1u_8
e = 1u_1
f = 1u_2
g = 1u_4
h = 1u_8
end
./f951 -quiet -g -dA a.f90 -funsigned -o - | grep -A3 DW_TAG_base_type | grep
DW_AT_name
.long .LASF4 # DW_AT_name: "integer(kind=4)"
.long .LASF5 # DW_AT_name: "character(kind=1)"
.long .LASF6 # DW_AT_name: "integer(kind=8)"
.long .LASF7 # DW_AT_name: "unsigned(kind=2)"
.long .LASF8 # DW_AT_name: "character(kind=4)"
.long .LASF9 # DW_AT_name: "unsigned(kind=8)"
As you can see, unsigned(kind=2) and unsigned(kind=8) is properly in there, but
instead of unsigned(kind=1) and unsigned(kind=4) there is character(kind=1) and
character(kind=4).
One can see it even in -fdump-tree-gimple dump:
character(kind=1) a[2];
unsigned(kind=2) b[2];
character(kind=4) c[2];
unsigned(kind=8) d[2];
character(kind=1) e;
unsigned(kind=2) f;
character(kind=4) g;
unsigned(kind=8) h;
This results in really bad debugging experience, as debuggers will try to print
the unsigned(kind=1) arrays as character(1) strings and similarly for
unsigned(kind=4).
trans-types.cc says:
/* The middle end only recognizes a single unsigned type. For
compatibility of existing test cases, let's just use the
character type. The reader of tree dumps is expected to be able
to deal with this. */
Sure, make_unsigned_type will return just one type, but can't it just
build_variant_type_copy or something similar?