vaughan%cadillac.cad.mcc.com@MCC.COM (Paul Vaughan) (01/17/90)
The following source, involving a virtual base class and virtual
methods, causes the compiler to segv. This may be related to Newton's
previous bug report involving a similar hierarchy where the compiler
terminated successfully, but incorrect results were obtained.
#include <stream.h>
class NameSpaceTable;
class Object {
public:
Object() {};
virtual ~Object() {cout << "~Object()\n";}
virtual int isA() { return 1; }
};
class NamedObject: public Object
{
public:
NamedObject(const char* n = 0);
~NamedObject();
virtual const char* Name() const;
virtual int isA() { return 2; }
private:
const char* name=0;
};
const char* NamedObject::Name() const {
if (name) return name; else return "?????";
}
NamedObject::NamedObject(const char* n = 0): () {
name = n;
cout << (int) this << " NamedObject() Name() = " << Name() << "\n";
}
NamedObject::~NamedObject() {
cout << (int) this << " ~NamedObject() " << (int)name << "\n";
}
class Entity: public NamedObject {
public:
Entity(const char* n=0,Entity* o=0,NameSpaceTable* nspace=0,
int namespaceSize = 100) : NamedObject(n) {};
~Entity() { cout << "~Entity()\n";}
virtual int isA() { return 3; }
};
class Attribute : public virtual Entity {
public:
Attribute(const char* n=0,Entity* o=0,NameSpaceTable* nspace=0)
: Entity(n,o,nspace,0) {};
~Attribute() {cout << "~Attribute()\n";}
virtual int isA() { return 4; }
};
class IntegerAt : public Attribute {
public:
IntegerAt(const char* n=0,Entity* o=0,NameSpaceTable* nspace=0)
: Attribute(n,o,nspace) {};
// ~IntegerAt() {cout << "~IntegerAt()\n";}
virtual void SetValue(int) {};
virtual int isA() { return 5; }
};
class Behavior : public virtual Entity {
public:
Behavior(const char* n= 0, Entity* o = 0, NameSpaceTable* ns = 0, int s = 0)
: Entity (n, o, ns, s) {};
virtual ~Behavior() {cout << "~Behavior()\n";}
virtual int isA() { return 6; }
};
class AttributeBehavior : public Behavior {
public:
AttributeBehavior(const char* n = 0, Entity* o = 0, NameSpaceTable* ns = 0,
int s = 0) : Behavior (n, o, ns, s) {}
~AttributeBehavior() {cout << "~AttributeBehavior()\n";}
virtual int isA() { return 7; }
};
class InterAtt : public AttributeBehavior {
public:
InterAtt() { cout << "InterAtt() Name() = " << Name() << "\n"; };
// ~InterAtt() {cout << "~InterAtt()\n";}
virtual int isA() { return 8; }
};
class ServiceDelayAt : public IntegerAt {
public:
ServiceDelayAt() : IntegerAt("delay") {
cout << "ServiceDelayAt() Name() = " << Name() << "\n";
};
// virtual const char* Name() const {
// cout << "<" << (int) this << " ServiceDelayAt::Name>";
// return NamedObject::Name(); }
~ServiceDelayAt() {};
virtual int isA() { return 9; }
virtual void SetValue(int) {};
};
class IServiceDelayAt : public InterAtt, public ServiceDelayAt {
public:
IServiceDelayAt();
~IServiceDelayAt();
// virtual const char* Name() const {
// cout << "<" << (int) this << " IServiceDelayAt::Name>";
// return ServiceDelayAt::Name();
// }
virtual void SetValue(int) {};
virtual int isA() { return 10; }
};
IServiceDelayAt::~IServiceDelayAt() {cout << "~ServiceDelayAt()\n";}
IServiceDelayAt::IServiceDelayAt() {
cout << "IServiceDelayAt()Name() = " << Name() << "\n";
}
main() {
cout << "main()\n";
cout.flush();
IServiceDelayAt* delay = new IServiceDelayAt;
cout << "\n";
cout << "delay->Name() = " << delay->Name() << "\n\n";
cout << "delay->isA() = " << delay->isA() << "\n\n"; // line 121
delete delay;
}
[2.480]puma) g++-1.36.3 -v -o vhier vhier.cc
g++ version 1.36.3 (based on GCC 1.36.92)
/usr/local/gnu/1.36.3/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 vhier.cc /usr/tmp/cca08929.cpp
GNU CPP version 1.36.92
/usr/local/gnu/1.36.3/lib/gcc-cc1plus /usr/tmp/cca08929.cpp -quiet -dumpbase vhier.cc -version -o /usr/tmp/cca08929.s
GNU C++ version 1.36.3 (based on GCC 1.36.92) (68k, MIT syntax) compiled by GNU C version 1.36.92.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
vhier.cc: In function int main ():
vhier.cc:121: Segmentation violation
g++-1.36.3: Program cc1plus got fatal signal 11.