This is the mail archive of the
gdb-prs@sources.redhat.com
mailing list for the GDB project.
Re: gdb/911: calling user-defined operators in gdb
- From: Michael Elizabeth Chastain <mec at shout dot net>
- To: nobody at sources dot redhat dot com
- Cc: gdb-prs at sources dot redhat dot com,
- Date: 8 Jan 2003 19:38:36 -0000
- Subject: Re: gdb/911: calling user-defined operators in gdb
- Reply-to: Michael Elizabeth Chastain <mec at shout dot net>
The following reply was made to PR c++/911; it has been noted by GNATS.
From: Michael Elizabeth Chastain <mec@shout.net>
To: gdb-gnats@sources.redhat.com
Cc:
Subject: Re: gdb/911: calling user-defined operators in gdb
Date: Wed, 8 Jan 2003 13:29:55 -0600
I see this happening on my system with both dwarf-2 and stabs+.
target=native, host=i686-pc-linux-gnu, osversion=red-hat-8.0
gdb=5.3, gcc=3.2.1, binutils=2.13.2.1, libc=vendor
gformat => (dwarf-2, stabs+)
The first typescript shows this happening with a test program.
The direct form works:
(gdb) print f0 == f0
$1 = true
(gdb) print f0 == f1
$2 = false
You can also work around the bug by quoting:
(gdb) print f0.'operator=='(f0)
$1 = true
(gdb) print f0.'operator=='(f1)
$2 = false
It's still a bug that 'f0.operator==(f1)' does not work and gives a
bogus error message. The bug still happens with gdb HEAD%20030107.
The second script shows some information from debugging gdb. gdb is
evaluating an expression with a BINOP_EQUAL node. A quick look at
c-exp.y shows that the lexer and the parser have no code to support
for C++ operator functions, so the expression parser is parsing this as
'(f0.operator) == (f1)'.
Michael C
===
Script started on Wed Jan 8 13:59:55 2003
[mec@berman gdb-pr-911]$ cat operator.cc
class Foo
{
public:
Foo (int);
bool operator == (const Foo &);
private:
int i_;
};
Foo::Foo (int i)
: i_ (i)
{
;
}
bool Foo::operator==(const Foo & f1)
{
bool equals;
equals = this->i_ == f1.i_;
return equals;
}
void marker ()
{
;
}
int main ()
{
Foo f0 (0);
Foo f1 (1);
marker ();
return 0;
}
[mec@berman gdb-pr-911]$ /berman/migchain/install/target/native/gcc-3.2.1-binutills-2.13.2.1/bin/g++ -v -gdwarf-2 -o operator.dwarf-2.exe operator.cc
Reading specs from /berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/specs
Configured with: /berman/migchain/source/gcc-3.2.1/configure --prefix=/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1 --disable-shared --with-gnu-as --with-as=/berman/migchain/install/target/native/binutils-2.13.2.1/bin/as --with-gnu-ld --with-ld=/berman/migchain/install/target/native/binutils-2.13.2.1/bin/ld
Thread model: posix
gcc version 3.2.1
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/cc1plus -v -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=1 -D__GXX_ABI_VERSION=102 -D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ operator.cc -D__GNUG__=3 -D__DEPRECATED -D__EXCEP TIONS -quiet -dumpbase operator.cc -gdwarf-2 -version -o /tmp/cc6B1PfJ.s
GNU CPP version 3.2.1 (cpplib) (i386 Linux/ELF)
GNU C++ version 3.2.1 (i686-pc-linux-gnu)
compiled by GNU C version 3.2.1.
ignoring nonexistent directory "/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include/c++/3.2.1
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include/c++/3.2.1/i686-pc-linux-gnu
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include/c++/3.2.1/backward
/usr/local/include
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/include
/usr/include
End of search list.
/berman/migchain/install/target/native/binutils-2.13.2.1/bin/as -V -Qy -o /tmp/ccM3aTPl.o /tmp/cc6B1PfJ.s
GNU assembler version 2.13.2.1 (i686-pc-linux-gnu) using BFD version 2.13.2.1
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o operator.dwarf-2.exe /usr/lib/crt1.o /usr/lib/crti.o /berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/crtbegin.o -L/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1 -L/berman/migchain/install/target/native/gcc-3.2.1-binutils -2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/../../.. /tmp/ccM3aTPl.o -lstdc++ -lm -lgcc -lc -lgcc /berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/crtend.o /usr/lib/crtn.o
[mec@berman gdb-pr-911]$ /berman/migchain/install/target/native/gcc-3.2.1-binutills-2.13.2.1/bin/g++ -v -gstabs+ -o operator.stabs+.exe operator.cc
Reading specs from /berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/specs
Configured with: /berman/migchain/source/gcc-3.2.1/configure --prefix=/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1 --disable-shared --with-gnu-as --with-as=/berman/migchain/install/target/native/binutils-2.13.2.1/bin/as --with-gnu-ld --with-ld=/berman/migchain/install/target/native/binutils-2.13.2.1/bin/ld
Thread model: posix
gcc version 3.2.1
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/cc1plus -v -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=1 -D__GXX_ABI_VERSION=102 -D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -D_GNU_SOURCE -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__ -D__tune_pentiumpro__ operator.cc -D__GNUG__=3 -D__DEPRECATED -D__EXCEP TIONS -quiet -dumpbase operator.cc -gstabs+ -version -o /tmp/ccwQn4rL.s
GNU CPP version 3.2.1 (cpplib) (i386 Linux/ELF)
GNU C++ version 3.2.1 (i686-pc-linux-gnu)
compiled by GNU C version 3.2.1.
ignoring nonexistent directory "/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include/c++/3.2.1
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include/c++/3.2.1/i686-pc-linux-gnu
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include/c++/3.2.1/backward
/usr/local/include
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/include
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/include
/usr/include
End of search list.
/berman/migchain/install/target/native/binutils-2.13.2.1/bin/as -V -Qy -o /tmp/ccVE5NoA.o /tmp/ccwQn4rL.s
GNU assembler version 2.13.2.1 (i686-pc-linux-gnu) using BFD version 2.13.2.1
/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o operator.stabs+.exe /usr/lib/crt1.o /usr/lib/crti.o /berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/crtbegin.o -L/berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1 -L/berman/migchain/install/target/native/gcc-3.2.1-binutils- 2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/../../.. /tmp/ccVE5NoA.o -lstdc++ -lm -lgcc -lc -lgcc /berman/migchain/install/target/native/gcc-3.2.1-binutils-2.13.2.1/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/crtend.o /usr/lib/crtn.o
[mec@berman gdb-pr-911]$ /berman/migchain/install/target/native/gdb-5.3/bin/gdb operator.dwarf-2.exe
GNU gdb 5.3
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
(gdb) break marker
Breakpoint 1 at 0x8048393: file operator.cc, line 26.
(gdb) run
Starting program: /berman/home/mec/gdb-pr-911/operator.dwarf-2.exe
Breakpoint 1, marker() () at operator.cc:26
26 }
(gdb) up
#1 0x080483d1 in main () at operator.cc:32
32 marker ();
(gdb) print f0
$1 = {i_ = 0}
(gdb) print f1
$2 = {i_ = 1}
(gdb) print f0.operator==(f1)
There is no member or method named operator.
(gdb) quit
The program is running. Exit anyway? (y or n) y
[mec@berman gdb-pr-911]$ /berman/migchain/install/target/native/gdb-5.3/bin/gdb operator.stabs+.exe
GNU gdb 5.3
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
(gdb) break marker
Breakpoint 1 at 0x8048393: file operator.cc, line 26.
(gdb) run
Starting program: /berman/home/mec/gdb-pr-911/operator.stabs+.exe
Breakpoint 1, marker() () at operator.cc:26
26 }
(gdb) up
#1 0x080483d1 in main () at operator.cc:32
32 marker ();
(gdb) print f0
$1 = {i_ = 0}
(gdb) print f1
$2 = {i_ = 1}
(gdb) print f0.operator==(f1)
There is no member or method named operator.
(gdb) quit
The program is running. Exit anyway? (y or n) y
[mec@berman gdb-pr-911]$ exit
exit
Script done on Wed Jan 8 14:03:13 2003
===
(gdb) print f0.operator==(f1)
Breakpoint 1, value_struct_elt (argp=0xbfffed60, args=0x0,
name=0x83643ec "operator", static_memfuncp=0x0,
err=0xbfffed60 "xL5\bàL5\b\200±\022BТ\022B")
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/valops.c:2443
2443 COERCE_ARRAY (*argp);
[top] bt 10
#0 value_struct_elt (argp=0xbfffed60, args=0x0, name=0x83643ec "operator",
static_memfuncp=0x0, err=0xbfffed60 "xL5\bàL5\b\200±\022BТ\022B")
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/valops.c:2443
#1 0x08098908 in evaluate_subexp_standard (expect_type=0x83643c0,
exp=0x83643c0, pos=0xbffff1d4, noside=EVAL_NORMAL)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/eval.c:1070
#2 0x08094de6 in evaluate_subexp (expect_type=0xbfffed60, exp=0x8354c78,
pos=0xbfffed60, noside=3221220704)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/eval.c:69
#3 0x08095d23 in evaluate_subexp_standard (expect_type=0x83643c0,
exp=0x83643c0, pos=0xbffff1d4, noside=EVAL_NORMAL)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/eval.c:1455
#4 0x08094de6 in evaluate_subexp (expect_type=0xbfffed60, exp=0x8354c78,
pos=0xbfffed60, noside=3221220704)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/eval.c:69
#5 0x0809500f in evaluate_expression (exp=0xbfffed60)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/eval.c:158
#6 0x080a4049 in print_command_1 (exp=0x826189e "f0.operator==(f1)",
inspect=0, voidprint=1)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/printcmd.c:907
#7 0x080a40d1 in print_command (exp=0xbfffed60 "xL5\bàL5\b\200±\022BТ\022B",
from_tty=1) at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/printcmd.c:951
#8 0x08075e89 in do_cfunc (c=0xbfffed60,
args=0xbfffed60 "xL5\bàL5\b\200±\022BТ\022B", from_tty=-1073746592)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/cli/cli-decode.c:53
#9 0x08077cec in cmd_func (cmd=0x826baf0,
args=0xbfffed60 "xL5\bàL5\b\200±\022BТ\022B", from_tty=-1073746592)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/cli/cli-decode.c:1523
(More stack frames follow...)
[top] frame 1
#1 0x08098908 in evaluate_subexp_standard (expect_type=0x83643c0,
exp=0x83643c0, pos=0xbffff1d4, noside=EVAL_NORMAL)
at /berman/fsf/_today_/source/gdb/HEAD/src/gdb/eval.c:1070
1070 return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string,
[top] print exp
$1 = (struct expression *) 0x83643c0
[top] print *exp
$2 = {language_defn = 0x821eb80, nelts = 14, elts = {{opcode = BINOP_EQUAL,
symbol = 0xe, longconst = 14,
doubleconst = -0.590133193756729029967553863121668e+2639,
string = 14 '\016', type = 0xe, internalvar = 0xe, block = 0xe}}}