mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
[gdb/exp] Fix internal error when printing C++ pointer-to-member
When running the test-case included with this patch, we run into: ... (gdb) print ptm^M $1 = gdb/gdbtypes.h:695: internal-error: loc_bitpos: \ Assertion `m_loc_kind == FIELD_LOC_KIND_BITPOS' failed.^M ... while printing a c++ pointer-to-member. Fix this by skipping static fields in cp_find_class_member, such that we have: ... (gdb) print ptm^M $1 = &A::i^M ... Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29294
This commit is contained in:
parent
99298c958c
commit
22f8e2e726
@ -636,7 +636,10 @@ cp_find_class_member (struct type **self_p, int *fieldno,
|
||||
|
||||
for (i = TYPE_N_BASECLASSES (self); i < len; i++)
|
||||
{
|
||||
LONGEST bitpos = self->field (i).loc_bitpos ();
|
||||
field &f = self->field (i);
|
||||
if (field_is_static (&f))
|
||||
continue;
|
||||
LONGEST bitpos = f.loc_bitpos ();
|
||||
|
||||
QUIT;
|
||||
if (offset == bitpos)
|
||||
|
34
gdb/testsuite/gdb.cp/pointer-to-member.cc
Normal file
34
gdb/testsuite/gdb.cp/pointer-to-member.cc
Normal file
@ -0,0 +1,34 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2022 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/>. */
|
||||
|
||||
struct A
|
||||
{
|
||||
int i;
|
||||
};
|
||||
|
||||
struct B : public A
|
||||
{
|
||||
static const int j = 0;
|
||||
};
|
||||
|
||||
int B::*ptm = &B::i;
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return 0;
|
||||
}
|
28
gdb/testsuite/gdb.cp/pointer-to-member.exp
Normal file
28
gdb/testsuite/gdb.cp/pointer-to-member.exp
Normal file
@ -0,0 +1,28 @@
|
||||
# Copyright (C) 2022 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/>.
|
||||
|
||||
# This file is part of the gdb testsuite.
|
||||
|
||||
# Test printing c++ pointer-to-member.
|
||||
|
||||
if { [skip_cplus_tests] } { continue }
|
||||
|
||||
standard_testfile .cc
|
||||
|
||||
if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
|
||||
return -1
|
||||
}
|
||||
|
||||
gdb_test "print ptm" " = &A::i"
|
Loading…
Reference in New Issue
Block a user