Thread View: gnu.g++.bug
1 messages
1 total messages
Started by Dave Nichols
Thu, 07 Dec 1989 00:05
pointers to member functions on convex
Author: Dave Nichols
Date: Thu, 07 Dec 1989 00:05
Date: Thu, 07 Dec 1989 00:05
130 lines
4720 bytes
4720 bytes
A problem with pointers to member functions ?
g++ 1.36.2- + patches posted in gnu.g++.bug ( also fails with 1.36.0 )
Running on a convex-c1 (convex unix 7.1), collect2 is used for loading.
tm.h@ -> ./config/tm-convex1.h
md@ -> ./config/convex.md
This code is derived from the squares demo in Interviews, there appears to
be problem with pointers to member functions when vtbls are used.
If the code is compiled with -Dvtbl ( which forces the class to have a
virtual function table ) it fails, see below.
This code works fine ether way on a sun4 and a DECstation3100.
Script started on Wed Dec 6 14:18:33 1989
hanauma 301> cat testdn.c
#include <stream.h>
class SquaresFrame;
typedef void (SquaresFrame::*MenuFunc)();
class SquaresFrame {
public:
SquaresFrame();
void DoCommands( MenuFunc[], int );
void Print1();
#ifdef vtbl
virtual void Print2();
#else
void Print2();
#endif
};
SquaresFrame::SquaresFrame () { }
void SquaresFrame::DoCommands( MenuFunc funcs[], int num ) {
for (int i = 0; i <num ; i++) {
( this->*funcs[i])();
}
}
void SquaresFrame::Print1() { cout << "1 \n" ; }
void SquaresFrame::Print2() { cout << "2 \n" ; }
main() {
MenuFunc funclist[2] = { &SquaresFrame::Print1 , &SquaresFrame::Print2 };
SquaresFrame* test= new SquaresFrame();
test->DoCommands(funclist,2);
}
****** The SquaresFrame class doesn't have a vtbl in this case ********
hanauma 302> g++ -v -g -I/usr/local/include/g++-include testdn.c
g++ version 1.36.2- (based on GCC 1.36)
/usr/local/lib/gcc-cpp -+ -v -I/usr/local/include/g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dconvex -Dparsec -Dunix -D__convex__ -D__parsec__ -D__unix__ testdn.c /usr/tmp/cc023439.cpp
GNU CPP version 1.36
/usr/local/lib/gcc-cc1plus /usr/tmp/cc023439.cpp -quiet -dumpbase testdn.c -g -version -o /usr/tmp/cc023439.s
GNU C++ version 1.36.2- (based on GCC 1.36) (convex) compiled by GNU C version 1.36.
default target switches: -mc1
as -o testdn.o /usr/tmp/cc023439.s
/usr/local/lib/gcc-ld /lib/crt0.o testdn.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc
hanauma 303> a.out
1
2
****** now force the SquaresFrame class to have a vtbl ********
hanauma 304> g++ -v -g -I/usr/local/include/g++-include testdn.c -Dvtbl
g++ version 1.36.2- (based on GCC 1.36)
/usr/local/lib/gcc-cpp -+ -v -Dvtbl -I/usr/local/include/g++-include -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dconvex -Dparsec -Dunix -D__convex__ -D__parsec__ -D__unix__ testdn.c /usr/tmp/cc023488.cpp
GNU CPP version 1.36
/usr/local/lib/gcc-cc1plus /usr/tmp/cc023488.cpp -quiet -dumpbase testdn.c -g -version -o /usr/tmp/cc023488.s
GNU C++ version 1.36.2- (based on GCC 1.36) (convex) compiled by GNU C version 1.36.
default target switches: -mc1
as -o testdn.o /usr/tmp/cc023488.s
/usr/local/lib/gcc-ld /lib/crt0.o testdn.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc
hanauma 305> a.out
Segmentation fault (core dumped)
hanauma 306> gdb a.out
GDB 3.4, Copyright (C) 1989 Free Software Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /sep/dave/test/g++/a.out...done.
Type "help" for a list of commands.
(gdb) run
Starting program: /sep/dave/test/g++/a.out
Program received signal 11, Segmentation fault
0x80000000 in gen$soff ()
(gdb) where
#0 0x80000000 in gen$soff ()
#1 0x80001260 in DoCommands__12SquaresFramePPM12SquaresFrameFv_vi (...) (...)
#2 0x800013f2 in main (...) (...)
(gdb) up
Reading in symbols for testdn.c...done.
#1 0x80001260 in DoCommands__12SquaresFramePPM12SquaresFrameFv_vi ($this=(SquaresFrame *) 0x80019000, funcs=(MenuFunc *) 0xffffcda8, num=2) (testdn.c line 26)
26 ( this->*funcs[i])();
(gdb) p funcs[0]
$1 = (MenuFunc) (MenuFunc) 268436047
(gdb) q
The program is running. Quit anyway? (y or n) y
Notes
-----
(1) gdb on the convex never seems to print out the member functions nicely
like it does on a sun4, this may or may not be related.
(2) If only one function is present (remove all references to print1 ) it
works fine.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads