tiemann@arkesden.eng.sun.com (Michael Tiemann) (02/05/90)
Posted-Date: Fri, 2 Feb 90 22:17:50 CST
Date: Fri, 2 Feb 90 22:17:50 CST
From: vaughan%cadillac.cad.mcc.com@mcc.com (Paul Vaughan)
The following source cause g++-1.36.4 to crash
class Foo;
class Entity {
private:
Entity* owner=0 ;
};
class MessagePort : public virtual Entity {
public:
MessagePort(Foo*);
private:
Foo& owner;
};
MessagePort::MessagePort(Foo* o)
: owner(*o)
{
} //line 18
--------------------------
g++-1.36.4: Program cc1plus got fatal signal 11.
[1.300]puma) g++-1.36.4 -v cpp.cc
g++ version 1.36.4 (based on GCC 1.36.93)
/usr/local/gnu/1.36.4/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 cpp.cc /usr/tmp/cca03352.cpp
GNU CPP version 1.36.92
/usr/local/gnu/1.36.4/lib/gcc-cc1plus /usr/tmp/cca03352.cpp -quiet -dumpbase cpp.cc -version -o /usr/tmp/cca03352.s
GNU C++ version 1.36.4 (based on GCC 1.36.93) (68k, MIT syntax) compiled by GNU C version 1.36.92.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
cpp.cc: In method MessagePort::MessagePort (class Foo *):
cpp.cc:18: Segmentation violation
g++-1.36.4: Program cc1plus got fatal signal 11.
But, the following code compiles cleanly
class Foo;
class Entity {
private:
Entity* owner=0 ;
};
class MessagePort : public Entity {
public:
MessagePort(Foo*);
private:
Foo& owner;
};
MessagePort::MessagePort(Foo* o)
: owner(*o)
{
} //line 18
The difference is that Entity is not a virtual base class here. I'm
not sure of the rule here. Is this inadmissable code or not? Anyway,
it isn't the code I want now that I see the problem.
Here's the patch:
arkesden% diff -c2 cplus-init.c~ cplus-init.c
*** cplus-init.c~ Tue Jan 30 21:43:31 1990
--- cplus-init.c Sun Feb 4 20:41:11 1990
***************
*** 380,384 ****
tree field = (TREE_CODE (name) == COMPONENT_REF
? TREE_OPERAND (name, 1) : IDENTIFIER_CLASS_VALUE (name));
! tree type = TREE_TYPE (field);
if (TREE_STATIC (field))
--- 380,394 ----
tree field = (TREE_CODE (name) == COMPONENT_REF
? TREE_OPERAND (name, 1) : IDENTIFIER_CLASS_VALUE (name));
! tree type;
!
! /* If one member shadows another, get the outermost one. */
! if (TREE_CODE (field) == TREE_LIST)
! {
! field = TREE_VALUE (field);
! if (DECL_CONTEXT (field) != current_class_type)
! error ("field `%s' not in immediate context");
! }
!
! type = TREE_TYPE (field);
if (TREE_STATIC (field))
arkesden%
Michael