vaughan%cadillac.cad.mcc.com@MCC.COM (Paul Vaughan) (12/05/89)
The following file produces incorrect output (in my and a few
colleagues estimation), when compiled with
[1.1119]puma) g++-1.36.2 -v -g -o com com.cc
g++ version 1.36.2- (based on GCC 1.36)
/usr/local/gnu/1.36.2/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 com.cc /usr/tmp/cca10913.cpp
GNU CPP version 1.36
/usr/local/gnu/1.36.2/lib/gcc-cc1plus /usr/tmp/cca10913.cpp -quiet -dumpbase com.cc -g -version -o /usr/tmp/cca10913.s
GNU C++ version 1.36.2- (based on GCC 1.36) (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
com.cc: In method IModel::IModel ():
com.cc:101: warning: function too large to be inline
/usr/local/gnu/1.36.2/lib/gcc-as -mc68020 -o com.o /usr/tmp/cca10913.s
/usr/local/gnu/1.36.2/lib/gcc-ld -o com -e start -dc -dp -Bstatic /lib/crt0.o /lib/Mcrt1.o com.o -lg++ /usr/local/gnu/1.36.2/lib/gcc-gnulib -lg -lc
and run on a SUN3.
---------------------------------
#include <stream.h>
class Selection;
class Port;
class Model;
class Simulator;
class PortBehavior;
class AttributeBehavior;
class IModelPort;
struct IModelPortPSLList {};
struct SimUnitpSLList {};
enum PortType {IN, OUT, BI};
class SimUnit {
public:
SimUnit() {};
virtual ~SimUnit() {};
Simulator *simulator;
Model *model;
virtual void error(char*) {};
virtual void connect(SimUnit*) {};
virtual void connect(Port*) {};
virtual void save() {};
virtual void reset() {};
virtual void start() {};
virtual void setSimulator(Simulator*) {};
virtual void inspect() {};
//private:
};
class Model : public SimUnit {
public:
void addUnit(SimUnit*) {};
void deleteUnit(SimUnit*) {};
void addPort(Port*) {};
void deletePort(Port*) {};
void reset() {};
virtual void start() {};
virtual void printSubUnits() {};
void setSimulator(Simulator*) {};
Model() {};
virtual ~Model() {};
protected:
SimUnitpSLList subunits;
};
class Behavior {
public:
Behavior() {};
virtual ~Behavior() {};
virtual Behavior* GetPart(char*) {};
virtual void SetIcon(Selection*) {};
virtual void UnSetIcon(Selection*) {};
virtual int HaveAttributes() {};
virtual AttributeBehavior** GetAttributes() {};
protected:
void Warn(char*) {};
Selection* icon;
};
class PrimitiveBehavior : public Behavior {
public:
PrimitiveBehavior() {};
~PrimitiveBehavior() {};
virtual int AddPortOK(PortType) {};
virtual char** PortChoices(PortType) {};
virtual void AddPort(PortBehavior*) {};
virtual void DeletePort(PortBehavior*) {};
};
class ModelBehavior : public PrimitiveBehavior {
public:
ModelBehavior() {};
~ModelBehavior() {};
virtual void AddUnit(PrimitiveBehavior*) {};
virtual void DeleteUnit(PrimitiveBehavior*) {};
virtual void AddUnit(ModelBehavior*) {};
virtual void DeleteUnit(ModelBehavior*) {};
};
class IModel : public ModelBehavior, public Model {
public:
IModel() {
cout << "IModel::IModel() this = " << (int) this << "\n"
<< " (Behavior*) this = " << (int) (Behavior*) this << "\n"
<< " &icon = " << (int) &icon << "\n"
<< " (PrimitiveBehavior*) this = " << (int) (PrimitiveBehavior*) this << "\n"
<< " (ModelBehavior*) this = " << (int) (ModelBehavior*) this << "\n"
<< " (SimUnit*) this = " << (int) (SimUnit*) this << "\n"
<< " &simulator = " << (int) &simulator << "\n"
<< " &model = " << (int) &model << "\n"
<< " (Model*) this = " << (int) (Model*) this << "\n"
<< " &subunits = " << (int) &subunits << "\n"
<< "----" << "\n"
<< " &inports = " << (int) &inports << "\n";
};
~IModel() {};
void AddUnit(PrimitiveBehavior*) {};
void DeleteUnit(PrimitiveBehavior*) {};
void AddUnit(ModelBehavior*) {};
void DeleteUnit(ModelBehavior*) {};
int AddPortOK(PortType) {};
char** PortChoices(PortType) {};
void AddPort(PortBehavior*) {};
void DeletePort(PortBehavior*) {};
int HaveAttributes() {};
AttributeBehavior** GetAttributes() {};
Behavior* GetPart(char*) {};
void Disconnect(PortBehavior*, Selection*) {};
protected:
IModelPortPSLList inports;
IModelPortPSLList outports;
IModelPortPSLList biports;
IModelPort* findPort(char*, IModelPortPSLList*) {};
private:
void deletePortList(IModelPortPSLList*) {};
};
main() {
IModel c;
}
----------------------------------
output:
[1.1120]puma) com
IModel::IModel() this = 251657336
(Behavior*) this = 251657336
&icon = 251657336
(PrimitiveBehavior*) this = 251657336
(ModelBehavior*) this = 251657336
(SimUnit*) this = 251657344
&simulator = 251657336
&model = 251657340
(Model*) this = 251657344
&subunits = 251657356
----
&inports = 251657358
-------------------------------------------
Note that the simulator and model slots are not in a reasonable place.
Everything else seems to be where it belongs. This is a bad bug--it
cost me about a whole day to locate, identify and isolate from my
application. It's also holding us back at the moment. It's
especially onerous because it used to work properly with the 1.36.0-
version.