[gnu.g++.bug] g++ bug or misunderstanding?

kempf@tci.bell-atl.com (Cory Kempf) (09/29/89)

I have either found two bugs in g++, or I don't quite understand C++ yet.  
Could someone who understands this stuff a bit better tell me which 
it is? (and explain it to me)
------------
the result:
Snoopy 166> g++ -o Bug Bug.cc
Snoopy 167> Bug
Lvl1 test
Level 1.2 test
Level 1.2.1 test
Lvl1 test		[ Bug? #1 I think this should print "Level 1.2.1 test"]
Snoopy 168> g++ -DBUG -o Bug2 Bug.cc
Failed assertion TREE_CODE (field) == FIELD_DECL at line 4191 of `cplus-class.c'.
g++: Program cc1plus got fatal signal 6.
Snoopy 169>
--------------
The code:

#include "stream.h"
#include <string.h>

typedef unsigned short ushort;
typedef unsigned long ulong;
typedef unsigned char uchar;

class Lvl1 {	// base class
  public:
    Lvl1() {;}		// there
    Lvl1(int val) {;}
    virtual void writetest() { cerr << "Lvl1 test\n"; }
};

class Lvl1_2 : public Lvl1 {
  public:
    Lvl1_2() {;}
    Lvl1_2(int val)  {;}
    virtual void writetest() { cerr << "Level 1.2 test\n"; }
};

typedef void Lvl1::(*FP)();	// pointer to method returning void

class Lvl1_2_1 : public Lvl1_2 {
  public:
    Lvl1_2_1(int val) {;}
    virtual void writetest() { cerr << "Level 1.2.1 test\n"; }
    void call(FP f) { (*f)(); }
};

    
main() {
    Lvl1 a(1);
    Lvl1_2 c(3);
    Lvl1_2_1 e(5);
    a.writetest();
    c.writetest();
    e.writetest();
#ifndef BUG
    Lvl1 *eq;		// pointer to e's base class
#else
    Lvl1_2_1 *eq;	// pointer to class of e; causes
                        // compiler to croak
#endif
    FP foo;		// method pointer
    eq = &e;		
    foo = eq->writetest;	// this SHOULD point to 
                                // Lvl1_2_1::writetest, 
                                // Shouldn't it??
    e.call(foo);	// and this should call it (via 
                        // Lvl1_2_1::call
}

-------------
Thanks in advance,
+C

-- 
Cory Kempf		Technology Concepts	     phone: (508) 443-7311 x341
uucp:	{anywhere}!uunet!tci!kempf, kempf@tci.bell-atl.com
DISCLAIMER: TCI is not responsible for my opinions, nor I for theirs