From: robert@porsche.visix.com (Robert Mollitor)
Subject: Problem with nested classes
Organization: GNUs Not Usenet
Distribution: gnu
Date: Tue, 29 Dec 1992 18:29:30 GMT

I have encountered a problem with the g++ compiler.  I have included
three versions (A, B, and C) of the same test program.  I would
prefer to use version A, but would settle for version B.  However, only
version C works the way I want it to.

Is my approach confused or are there compiler bugs lurking about (other
than the self-proclaimed one)?

Thanks,
Robert Mollitor (robert@visix.com)

-----------

gcc version 2.3.2
SunOS 4.1

g++ -o xxx xxx.c

A (during compile):
> xxx.c:39: Internal compiler error.
> xxx.c:39: Please report this to `bug-g++@prep.ai.mit.edu'.

B (during run):
> foo5
> foo5

C (during run):
> foo5
> foo3 bar9



/* A **********************************************************/
extern "C"
{
#include <stdio.h>

void printf(const char *, ...);
}

class object
{
public:

  object() { foo = 5; }

  virtual void Print() { printf("foo%d\n", foo); }

  class Manager
    {
    public:
      virtual object *CreateObject() { return new object; }
    };

  int foo;

};


class subobject : public object
{
public:

  subobject() { foo = 3; bar = 9; }

  void Print() { printf("foo%d bar%d\n", foo, bar); }

  class Manager : object::Manager
    {
    public:
      object *CreateObject() { return new subobject; }
    };

  int bar;

};


main(int argc, char **argv)
{
  object::Manager objectManager;
  subobject::Manager subobjectManager;
  object *object1, *object2;

  object1 = objectManager.CreateObject();
  object2 = subobjectManager.CreateObject();


  object1->Print();
  object2->Print();

}
/***********************************************************/



/* B **********************************************************/
extern "C"
{
#include <stdio.h>

void printf(const char *, ...);
}

class object
{
public:

  object() { foo = 5; }

  virtual void Print() { printf("foo%d\n", foo); }

  class Manager
    {
    public:
      virtual object *CreateObject() { return new object; }
    };

  int foo;

};


class subobject : public object
{
public:

  subobject() { foo = 3; bar = 9; }

  void Print() { printf("foo%d bar%d\n", foo, bar); }

  class xManager : object::Manager			/*** changed ***/
    {
    public:
      object *CreateObject() { return new subobject; }
    };

  typedef xManager Manager;				/*** added ***/

  int bar;

};


main(int argc, char **argv)
{
  object::Manager objectManager;
  subobject::Manager subobjectManager;
  object *object1, *object2;

  object1 = objectManager.CreateObject();
  object2 = subobjectManager.CreateObject();


  object1->Print();
  object2->Print();

}
/***********************************************************/



/* C **********************************************************/
extern "C"
{
#include <stdio.h>

void printf(const char *, ...);
}

class object
{
public:

  object() { foo = 5; }

  virtual void Print() { printf("foo%d\n", foo); }

  class Manager
    {
    public:
      virtual object *CreateObject() { return new object; }
    };

  int foo;

};


class subobject : public object
{
public:

  subobject() { foo = 3; bar = 9; }

  void Print() { printf("foo%d bar%d\n", foo, bar); }

  class xManager : object::Manager
    {
    public:
      object *CreateObject() { return new subobject; }
    };

  typedef xManager Manager;

  int bar;

};


main(int argc, char **argv)
{
  object::Manager objectManager;
  subobject::xManager subobjectManager;		/*** changed ***/
  object *object1, *object2;

  object1 = objectManager.CreateObject();
  object2 = subobjectManager.CreateObject();


  object1->Print();
  object2->Print();

}
/***********************************************************/


--
Robert Mollitor						      robert@visix.com
Visix Software Inc.					...!uupsi!visix!robert

Newsgroups: gnu.g++.bug