From: David Kastrup <dak@gnu.org> Date: Tue, 14 Oct 2014 11:10:55 +0000 (+0200) Subject: Even more typecasting of member function pointers in smobs.tcc X-Git-Tag: release/2.19.16-1~3^2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=6d391dc04f0faa3248d64aa36faf38cf9e4e5fa2;p=lilypond.git Even more typecasting of member function pointers in smobs.tcc This is yet-another-bugfix in order to get a rather inconspicuous member function pointer comparison accepted by old GCC versions. --- diff --git a/lily/include/smobs.tcc b/lily/include/smobs.tcc index 7b51792567..3a8e8c4f23 100644 --- a/lily/include/smobs.tcc +++ b/lily/include/smobs.tcc @@ -128,9 +128,12 @@ void Smob_base<Super>::init () if (&Super::free_smob != &Smob_base<Super>::free_smob) scm_set_smob_free (smob_tag_, Super::free_smob); - // Old GCC versions refuse comparing pointers-to-member-function of - // covariant types, so we recast here. - if (&Super::mark_smob != + // Old GCC versions get their type lattice for pointers-to-members + // tangled up to a degree where we need to typecast _both_ covariant + // types in order to be able to compare them. The other comparisons + // are for static member functions and thus are ordinary function + // pointers which work without those contortions. + if (static_cast<SCM (Super::*)()>(&Super::mark_smob) != static_cast<SCM (Super::*)()>(&Smob_base<Super>::mark_smob)) scm_set_smob_mark (smob_tag_, Super::mark_trampoline); scm_set_smob_print (smob_tag_, Super::print_trampoline);