[gnu.g++.bug] virtual function / private constructor bug

duvarney@bert.dg.com (Dan DuVarney) (04/12/89)

It seems there is some bad interaction between private constructors
and virtual functions. Consider the test program below:

-----------
// This may look like C code, but it is really -*- C++ -*-

#include <stdio.h>

class foo {
 public:
  virtual unsigned x();
};

unsigned foo::x()
{
  return 0;
}

class bar : public foo {
  bar(); // if this constructor is made public, everything works.

 public:
  virtual unsigned x();
};

bar::bar() {}

unsigned bar::x()
{
  return 1;
}

main()
{
  bar x;
  foo& y = x;

  printf("x.x() == %d\n", x.x());   // this call works
  printf("y.x() == %d\n", y.x());   // this call produces a core dump
}
-------

I compile this under g++ 1.34.1, and link with libg++ 1.34.0.
My build command is the following:

-------
/pdd/pde2/gnu/g++-1.34.1/usr/local/bin/g++ -g -c
     -I/pdd/pde2/gnu/g++-1.34.1/usr/local/lib/g++-include
     vf_test.cc
vf_test.cc:20: warning: class bar only defines private constructors and has
                        no friends
/pdd/pde2/gnu/g++-1.34.1/usr/local/bin/g++ -g -o vf_test
      -L/pdd/pde2/gnu/g++-1.34.1/usr/local/lib
       vf_test.o -lg++
-------

When I make bar's constructor public, I get the expected output:

-------
x.x() == 1
y.x() == 2
-------

But when bar's constructor is private, I get:

-------
y.x() == 1
Segmentation fault (core dumped)
-------

It appears that the wrong address is being computed for virtual method x().


Dan DuVarney      ...!mcnc!rti!dg-rtp!duvarney