* value.c (value_primitive_field): Take 'offset' into account for
	packed field.
gdb/testsuite
	* gdb.base/anon.exp: New file.
	* gdb.base/anon.c: New file.
This commit is contained in:
Tom Tromey 2010-09-30 18:58:08 +00:00
parent 9ae8282da7
commit 38f12cfce2
5 changed files with 77 additions and 2 deletions

View file

@ -1,3 +1,8 @@
2010-09-30 Tom Tromey <tromey@redhat.com>
* value.c (value_primitive_field): Take 'offset' into account for
packed field.
2010-09-30 Tom Tromey <tromey@redhat.com>
* completer.c (count_struct_fields): Handle anonymous structs and

View file

@ -1,3 +1,8 @@
2010-09-30 Tom Tromey <tromey@redhat.com>
* gdb.base/anon.exp: New file.
* gdb.base/anon.c: New file.
2010-09-30 Tom Tromey <tromey@redhat.com>
* gdb.base/completion.exp: Test completion through anonymous

View file

@ -0,0 +1,32 @@
/* Test of anonymous union in a struct. */
#include <string.h>
struct outer
{
int one;
int two;
struct
{
union {
int three : 3;
int four : 4;
};
union {
int five : 3;
int six : 4;
};
} data;
};
int main ()
{
struct outer val;
memset (&val, 0, sizeof (val));
val.data.six = 6;
return 0; /* break here */
}

View file

@ -0,0 +1,32 @@
# Copyright 2010 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/>.
#
set testfile "anon"
set srcfile $testfile.c
if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug}] } {
return -1
}
if { ![runto main] } then {
fail "run to main"
return
}
set loc [gdb_get_line_number "break here"]
gdb_test "break $loc" ".*Breakpoint 2 .*" "set breakpoint in anon.c"
gdb_continue_to_breakpoint "continue to breakpoint in anon.c"
gdb_test "print val.data.six" " = 6" "print val.data.six"

View file

@ -1973,8 +1973,9 @@ value_primitive_field (struct value *arg1, int offset,
v->bitpos = bitpos % container_bitsize;
else
v->bitpos = bitpos % 8;
v->offset = value_embedded_offset (arg1)
+ (bitpos - v->bitpos) / 8;
v->offset = (value_embedded_offset (arg1)
+ offset
+ (bitpos - v->bitpos) / 8);
v->parent = arg1;
value_incref (v->parent);
if (!value_lazy (arg1))