Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Apr 2003 16:38:41 +0200
From:      Simon Barner <barner@in.tum.de>
To:        freebsd-stable@freebsd.org
Subject:   Bug in g++ 2.95.4 (Pointer to member functions)
Message-ID:  <20030429143841.GA5828@zi025.glhnet.mhn.de>

next in thread | raw e-mail | index | archive | help

--mP3DRpeJDSE+ciuQ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi,

I think I have discovered a bug in FreeBSD 4.8-STABLE's system C++ compiler:

% gcc -v
% Using builtin specs.
% gcc version 2.95.4 20020320 [FreeBSD]

Here is a stripped down example that can be used to reproduce the bug:

// ----------- begin bug.cpp -----------
#include <iostream>
class Class {
	public:
		void M1 (void) { cout << "M1" << endl; };
		void M2 (void) { cout << "M2" << endl; };
		void M3 (void) { cout << "M3" << endl; };
};
=20
typedef  void (Class::*ClassMemberFn)(void);
#define callMemberFunction(object,ptrToMember)  ((object).*(ptrToMember))

int main (int argc, char* argv[]) {
	Class obj;
=09
	// This works fine: Array size =3D=3D 2
	ClassMemberFn a[2] =3D { &Class::M1, &Class::M2};
	for (unsigned int i=3D0; i<2; ++i) {
		callMemberFunction (obj, a[i]) ();
	}

=09
	// This will cause the internal compiler error: Array size > 2
	ClassMemberFn b[3] =3D { &Class::M1, &Class::M2,&Class::M3};
	for (unsigned int i=3D0; i<3; ++i) {
		callMemberFunction (obj, b[i]) ();
	}
	return 0;
}

// ----------- end bug.cpp -----------


This is how you can reproduce the internal compiler error:
% gcc -c bug.cpp
% bug.cpp: In function `int main(int, char **)':
% bug.cpp:20: Internal compiler error in `const_hash', at varasm.c:2373
% Please submit a full bug report.
% See <URL:http://www.gnu.org/software/gcc/bugs.html>; for instructions.

I have tested the same source (which is an adoption from the C++ FAQ-lite,
http://www.parashift.com/c++-faq-lite/pointers-to-members.html) an the
following systems:

Success:
   GCC 2.9.2, SunOS 5.8 Generic_108528-19 sun4u sparc SUNW,Ultra-60
   GCC 3.2.2, SunOS 5.8 Generic_108528-19 sun4u sparc SUNW,Ultra-60
   GCC 2.9.6 (redhat) , Linux athalle1 2.4.18-27.7.xsmp #1 SMP

Same compiler error:
   GCC 2.9.2, Linux athalle1 2.4.18-27.7.xsmp #1 SMP

My conclusion is, that this bug is i386 specific, and that it has been fixed
in g++ 3.x and Redhat's 2.96 proprietary version.

What should I do (apart from using gcc 3.x from the ports collection)?

Should I file a bug at the GCC gnats site, but I think they do not maintain
GCC 2.9.4 any longer (I have seen according comments at the end of closed
bug reports)?

Or should I send a PR? Is there any chance that this bug will be fixed?

I also had a look at the gcc source file from that error message, but it's
not very helpful as it's the location of an abort () call only...

Cheers,
 Simon

--mP3DRpeJDSE+ciuQ
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: Digital signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (FreeBSD)

iD8DBQE+ro5xCkn+/eutqCoRAlqYAKCSW66XrfWWy3Z4sN5kYuXgBrDbTQCfakB4
Ic8+i23RMM/Jgg7SKSYmHoY=
=yftD
-----END PGP SIGNATURE-----

--mP3DRpeJDSE+ciuQ--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030429143841.GA5828>