[gnu.g++.bug] g++ misses constructor

beshers@brcsun2.brc.uconn.edu (George Beshers) (05/02/89)

Consider nested functions calls where the first function calls
the second function from the return statement (I think this just
happens in the return statement).  The nested function returns
a *reference* to an object which is passed back by *value*.
The constructor is not called and the value is deleted.

For example:
#include <stream.h>
#include <string.h>

struct Ref {
    int ref;
    char *p;
};

struct Str {
    Ref *r;
    Str();
    Str(char *);
    Str(Str &);
    ~Str();
    friend ostream&
    operator<<(ostream&, Str);
};

Str::Str()
{ r = 0; }

Str::Str(char *q)
{
    r = new Ref;
    r->ref = 1;
    r->p = new char[strlen(q)];
    strcpy(r->p, q);
}

Str::Str(Str &S)
{
    r = S.r;
    r->ref++;
}

Str::~Str()
{
    if (r != 0) {
	r->ref--;
	if (r->ref == 0) {
	    delete r->p;
	    delete r;
	}
	r = 0;
    }
}

ostream& operator<<(ostream& out, Str S)
{
    out << S.r->p;
    return out;
}

Str A;

Str & f1()
{
    return A;
}

Str f2()
{
    return f1();
}

main()
{
    A = "Test\n";
    cout << f2();
    cout << A.r->ref << "\n";
}

Sun3/50 nfp
SunOS 3.5
C++ version 1.34.1 with most posted bug fixes.

			George Beshers