diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4e53bc01579..d6e879f452f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2013-02-18 Tom Tromey + + PR gdb/15102: + * dwarf2read.c (read_subrange_type): Use result of + 'check_typedef'. + 2013-02-16 Yuanhui Zhang * frame.c: Remove one extra white space after #include diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index d26e7c8f6f8..df6298b5f33 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -12736,7 +12736,7 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) static struct type * read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) { - struct type *base_type; + struct type *base_type, *orig_base_type; struct type *range_type; struct attribute *attr; LONGEST low, high; @@ -12744,9 +12744,12 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) const char *name; LONGEST negative_mask; - base_type = die_type (die, cu); - /* Preserve BASE_TYPE's original type, just set its LENGTH. */ - check_typedef (base_type); + orig_base_type = die_type (die, cu); + /* If ORIG_BASE_TYPE is a typedef, it will not be TYPE_UNSIGNED, + whereas the real type might be. So, we use ORIG_BASE_TYPE when + creating the range type, but we use the result of check_typedef + when examining properties of the type. */ + base_type = check_typedef (orig_base_type); /* The die_type call above may have already set the type for this DIE. */ range_type = get_die_type (die, cu); @@ -12876,7 +12879,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) if (!TYPE_UNSIGNED (base_type) && (high & negative_mask)) high |= negative_mask; - range_type = create_range_type (NULL, base_type, low, high); + range_type = create_range_type (NULL, orig_base_type, low, high); /* Mark arrays with dynamic length at least as an array of unspecified length. GDB could check the boundary but before it gets implemented at diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 77573b0d548..60c6bf8c484 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-02-18 Tom Tromey + + * gdb.dwarf2/subrange.exp: New file. + 2013-02-15 Pedro Alves Hafiz Abid Qadeer diff --git a/gdb/testsuite/gdb.dwarf2/subrange.exp b/gdb/testsuite/gdb.dwarf2/subrange.exp new file mode 100644 index 00000000000..51db92e0dc9 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/subrange.exp @@ -0,0 +1,82 @@ +# Copyright 2013 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 . +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +if { [skip_cplus_tests] } { continue } + +standard_testfile method-ptr.cc subrange-dw.S + +# Make some DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu 0 2 8 { + compile_unit {{language @DW_LANG_Pascal83}} { + declare_labels byte_label typedef_label array_label + + byte_label: base_type { + {name byte} + {encoding @DW_ATE_unsigned} + {byte_size 1 DW_FORM_sdata} + } + + typedef_label: typedef { + {name byte_typedef} + {type :$byte_label} + } + + array_label: array_type { + {type :$byte_label} + } { + subrange_type { + {lower_bound 0 DW_FORM_sdata} + {upper_bound 191 DW_FORM_sdata} + {byte_stride 2 DW_FORM_sdata} + {type :$typedef_label} + } + } + + typedef { + {name TByteArray} + {type :$array_label} + } + } + } +} + +if {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \ + object {nodebug}] != ""} { + return -1 +} + +if {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} { + return -1 +} + +if {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \ + "${binfile}" executable {c++}] != ""} { + return -1 +} + +clean_restart ${testfile} + +gdb_test_no_output "set language pascal" + +gdb_test "ptype TByteArray" \ + "type = array \\\[0\\.\\.191\\\] of byte"