diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.mi/mi-var-cmd.exp | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.mi/var-cmd.c | 35 | ||||
-rw-r--r-- | gdb/value.c | 1 |
5 files changed, 53 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5356d24..3ba2640 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2009-12-21 Vladimir Prus <vladimir@codesourcery.com> + + PR gdb/10884 + + * value.c (value_primitive_field): Call check_typedef + on the type. + 2009-12-21 Joel Brobecker <brobecker@adacore.com> * COPYING: Update to GPL version 3. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 180dc87..62eb4aa 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2009-12-21 Vladimir Prus <vladimir@codesourcery.com> + + PR gdb/10884 + + * gdb.mi/var-cmd.c (do_bitfield_tests): New + (main): Call do_bitfield_tests. + * gdb.mi/mi-cmd-var.exp: Run the 'bitfield' testcase. + 2009-12-20 Joel Brobecker <brobecker@adacore.com> * Makefile.in gdb.ada/gnat_ada.gpr, gdb.base/gcore-buffer-overflow.c, diff --git a/gdb/testsuite/gdb.mi/mi-var-cmd.exp b/gdb/testsuite/gdb.mi/mi-var-cmd.exp index 6efb333..4cb2552 100644 --- a/gdb/testsuite/gdb.mi/mi-var-cmd.exp +++ b/gdb/testsuite/gdb.mi/mi-var-cmd.exp @@ -577,6 +577,8 @@ proc set_frozen {varobjs flag} { mi_prepare_inline_tests $srcfile mi_run_inline_test frozen +mi_run_inline_test bitfield + # Since the inline test framework does not really work with # function calls, first to inline tests and then do the reminder # manually. diff --git a/gdb/testsuite/gdb.mi/var-cmd.c b/gdb/testsuite/gdb.mi/var-cmd.c index 6372f64..bbadc24 100644 --- a/gdb/testsuite/gdb.mi/var-cmd.c +++ b/gdb/testsuite/gdb.mi/var-cmd.c @@ -468,6 +468,40 @@ void do_at_tests () /*: END: floating :*/ } +/* Some header appear to define uint already, so apply some + uglification. Note that without uglification, the compile + does not fail, rather, we don't test what we want because + something else calls check_typedef on 'uint' already. */ +typedef unsigned int uint_for_mi_testing; + +struct Data { + int alloc; + uint_for_mi_testing sharable : 4; +}; + +/* Accessing a value of a bitfield whose type is a typed used to + result in division by zero. See: + + http://sourceware.org/bugzilla/show_bug.cgi?id=10884 + + This tests for this bug. */ + +void do_bitfield_tests () +{ + /*: BEGIN: bitfield :*/ + struct Data d = {0, 3}; + /*: + mi_create_varobj V d "create varobj for Data" + mi_list_varobj_children "V" { + {"V.alloc" "alloc" "0" "int"} + {"V.sharable" "sharable" "0" "unsigned int"} + } "list children of Data" + mi_check_varobj_value V.sharable 3 "access bitfield" + :*/ + return; + /*: END: bitfield :*/ +} + int main (int argc, char *argv []) { @@ -477,6 +511,7 @@ main (int argc, char *argv []) do_special_tests (); do_frozen_tests (); do_at_tests (); + do_bitfield_tests (); exit (0); } diff --git a/gdb/value.c b/gdb/value.c index 589e03b..e240c7a 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1873,6 +1873,7 @@ value_primitive_field (struct value *arg1, int offset, CHECK_TYPEDEF (arg_type); type = TYPE_FIELD_TYPE (arg_type, fieldno); + type = check_typedef (type); /* Handle packed fields */ |