[comp.lang.c++] bugs/help request

flanagan@odin.cs.cornell.edu (Doug Flanagan) (12/10/88)

One of our C++ users reports the following problems. We are running
C++ 1.2 from AT&T on Sun 3/50's. I personally don't use C++ so it could 
well be that this user's code is wrong. If it isn't, I'm sure he would
appreciate knowing what he is doing wrong. If it is correct, I would like
to know what some of the other C++ compilers for Suns do with these
examples. If you are running C++ on a Sun, could you please try these
and tell me your results (and what C++ compiler you are using)?
Thank you. E-mail replies to me:

-Doug Flanagan (flanagan@lnssun1.tn.cornell.edu)
 Cornell Lab. of Nuclear Studies

*************************************************************************
Here is a report of two bugs in our C++ compiler (cfront 1.2.1 2/16/87):
Bug 1:
Description:  One can not declare automatic variables of type pointer
    to vector (without using typedefs).

Example:
-------------------------------------------------------------------------------
int (*pv)[10];			// works

void f()
{
    static int (*pv2)[10];	//works
    int (*pv1)[10];		//doesn't work
}
-------------------------------------------------------------------------------
when compiled using CC -c, produces the following terminal output.
% CC -c pv1.c
CC  pv1.c:
"pv1.c", line 7: error:  pv1 is undefined
"pv1.c", line 7: warning: result of [] expression not used
1 error

Typedefs provide a partial way around this;  however, they are not perfect:


Bug 2:
Description:   delete generates an internal compiler error when one attempts
to delete space pointed to by a pointer to vector of structures:

Example:
-------------------------------------------------------------------------------
struct x_s {
    int a;
    int b;
};

void f(int n)
{
    typedef x_s Vec10x[10];
    Vec10x *px;	
    px = new Vec10x[n];	// works; produces "illegal pointer combination"
    delete px;
}			// line 12
-------------------------------------------------------------------------------
when compiled using CC -c produces the following terminal output:
% CC -c pv2.c
CC  pv2.c:
"pv2.c", line 12: internal <<cfront 1.2.1 2/16/87>> error:  expression::simpl: delete vector
1 error

If one replaces x_s with int in the typedef, the code compiles.
(Finally, if one comments out the "delete px" line, one gets:
% CC -c pv2.c
CC  pv2.c:
cc  -c  pv2..c
"pv2.c", line 10: warning: illegal pointer combination
which should not happen, but the resulting code looks correct.)

It is rare that one actually want to use a pointer to vector, and one can 
usually use pointer to pointer instead, but "rare" does not mean "never"!


Bug 3:
Example:
----------------------------------------------------------------------
/* File t.c */

struct A { int i; };
struct B { A& a; B(A&);}; // B::a is a reference to variable of type A
B::B(A& b) : a(b) {} //line 5:  initialization of B::a to b causes trouble


This is what happens when you try to compile this file on a SUN 3/50:

% CC -c t.c
CC  t.c:
"t.c", line 5: internal <<cfront 1.2.1 2/16/87>> error: bus error (or something nasty like that)
1 error
%

Compiling with flag -Fc one finds that cfront gets into the definition
of B::B(A&) but dies at the point where it wants to initialize B::a; the 
last fragment of a line it writes is 
                            _au0_this -> _B_a = 
after which it dies. On a MacII (rather than a SUN 3/50) cfront 
often gets past this point, and does the right thing. However it usually
has trashed something else in memory, often leading to rather interesting
consequences 5-10 minutes later.