[gnu.g++.bug] Curious behavior from 1.35.1

franke@dvscotty.cad.mcc.com (David Franke) (08/17/89)

The following message is generated by g++ version 1.35.1- (on SUN3)

    cannot specify initialization for virtual base class `class4'
    in base initialization for class `class5'

when applied to the following source program:

#include <stream.h>

//--------------------------------------------------------------------------
// Class8
//--------------------------------------------------------------------------
class class8 {
 public:
  virtual void *fn() { /* Some default action. */ return NULL; }
};

//--------------------------------------------------------------------------
// Class1
//--------------------------------------------------------------------------
class class1 : public class8 {
 public:
  char* name;

  class1 ( char *val ) : name(val) {}

  char *describe() { return name; }
};

//--------------------------------------------------------------------------
// Class2
//--------------------------------------------------------------------------
class class2 : public class1 {
 public:
  int a;

  class2 ( char *val, int ival ) : class1(val), a(ival) {}
};

//--------------------------------------------------------------------------
// Class9
//--------------------------------------------------------------------------
class class9 : public class2 {
 public:
  class9 ( char *val, int ival ) : class2(val,ival) {}
};

//--------------------------------------------------------------------------
// Class3
//--------------------------------------------------------------------------
class class3 : public class1 {
 public:
  class1 *yo;
  class1 *ho;

  class3 ( char *val ) : class1(val), yo(NULL), ho(NULL) {}
};

//--------------------------------------------------------------------------
// Class6
//--------------------------------------------------------------------------
class class6 {
 public:
  int i;
  class6 ( int ival ) : i(ival) {}
};

//--------------------------------------------------------------------------
// Class7
//--------------------------------------------------------------------------
class class7 {
 public:
  int j;
  class7 ( int ival ) : j(ival) {}
};

//--------------------------------------------------------------------------
// Class4
//--------------------------------------------------------------------------
class class4 : public class6, public class7 {
 public:
  int value;

  class4 ( int ival ) : value(ival), class6(ival+1), class7(ival+2) {}

  int ivalue() { return value; }
};

//--------------------------------------------------------------------------
// Class5
//--------------------------------------------------------------------------
class class5 : public class3, public class4 {
 public:
  class5 ( char *cval, int ival ) : class3(cval), class4(ival) {}
};

main ()
{
  char *s;
  class9 *p;

  p = new class9("Testing 1 2 3", 100);
  s = p->describe();

  cout << s << "\n";
}



The curious behavior is that several different small changes to this program
result in clean compiles, although the changes seem unrelated to the
reported error.  For example, by removing class7 from the inheritance list of
class4, all is forgiven.  Also, if the virtual member function declaration
is removed from class8, all is forgiven.

Any explanation of this behavior??
 David Franke, MCC CAD Program | ARPA: franke@mcc.com | Phone: [512] 338-3641
 UUCP: {uunet,harvard,gatech,pyramid}!cs.utexas.edu!milano!cadillac!franke