[gnu.g++.bug] Possible bug with Enumeration types

andrew@cs.hull.ac.uk (Andrew Stewart) (08/01/89)

GNU C++ version: 1.35.0
Compiled with command: g++ -v -g
Files for tm.h and md: tm-sun3.h, m68k.md
Machine: SUN-3, SUNOS 3.5

Behaviour:

Suppose you define an enumerated type of form:

	typedef enum { ... } X;

then define a method of the form

	class C {
	public:
		...
		void Method(X);
		...
	};

This is now compiled and stored in a library, with the enumerated type in a
header file for use by an application program.

Now: suppose that when you compile the application program, you define
another enumerated type BEFORE the enumerated type that is used by the
class C (by including another header file, for example).
From the loader, you get something like:

	xmain.o: Undefined symbol _Method_PSC_E$_1 referenced from text

I have appended the program that induces the error - if you compile x.cc
and stuff it into a library, swap the two "enum" definitions around and
compile xmain.c you get the error message.

This feels rather like a bug.

Andrew
--------------------
Andrew Stewart, Interactive Systems Design Group, University of Hull, Hull, UK
ARPA:   andrew@cs.hull.ac.uk	Telephone: +44 482 465744
JANET:	andrew@uk.ac.hull.cs	Fax: +44 482 466666
UUCP:	..!ukc!hu-cs!andrew

-------------------------- cut here -------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	x.h
#	x.cc
#	xmain.cc
# This archive created: Tue Aug  1 17:25:48 1989
# By:	Andrew Stewart ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'x.h'" '(315 characters)'
if test -f 'x.h'
then
	echo shar: will not over-write existing file "'x.h'"
else
sed 's/^X//' << \SHAR_EOF > 'x.h'
Xtypedef enum
X{
X	Four, Five, Six
X} KeyEventTwo;
X
Xtypedef enum
X{
X	One, Two, Three
X} KeyEvent;
X
Xclass First
X{
X	friend	class Second;
X
X	int	a,b,c;
X
X	First();
X	~First();
X	void yap();
X	void yap(KeyEvent);
X};
X
Xclass Second
X{
X	int	d,e,f;
X	class	First *g;
X
Xpublic:
X	Second();
X	~Second();
X	void zap();
X	void zap(KeyEvent);
X};
SHAR_EOF
fi # end of overwriting check
echo shar: extracting "'x.cc'" '(371 characters)'
if test -f 'x.cc'
then
	echo shar: will not over-write existing file "'x.cc'"
else
sed 's/^X//' << \SHAR_EOF > 'x.cc'
X#include	<stream.h>
X#include	"x.h"
X
XFirst::First()
X{
X	a = b = c = 1;
X}
X
XFirst::~First()
X{
X}
X
Xvoid First::yap()
X{
X	cout << "yap!\n";
X}
X
Xvoid First::yap(KeyEvent ev)
X{
X	cout << (int) ev << " yap!\n";
X}
X
XSecond::Second()
X{
X	d = e = f = 1;
X	g = new First;
X}
X
XSecond::~Second()
X{
X	delete g;
X}
X
Xvoid Second::zap()
X{
X	g->yap();
X}
X
Xvoid Second::zap(KeyEvent ev)
X{
X	g->yap(ev);
X}
SHAR_EOF
fi # end of overwriting check
echo shar: extracting "'xmain.cc'" '(170 characters)'
if test -f 'xmain.cc'
then
	echo shar: will not over-write existing file "'xmain.cc'"
else
sed 's/^X//' << \SHAR_EOF > 'xmain.cc'
X#include	<stream.h>
X#include	"x.h"
X
Xmain()
X{
X	class Second *x;
X	KeyEvent k;
X
X	k = Two;
X
X	x = new Second;
X	x->zap(k);
X	cout << "Hello, world\n";
X	cout << 12345 << "\n";
X}
SHAR_EOF
fi # end of overwriting check
#	End of shell archive
exit 0