bryan@relay.eu.net (Bryan Boreham) (10/28/89)
Program:
class firble
{
public:
int bar;
virtual void Print();
};
class smartptr
{
public:
int foo;
firble* operator->();
};
int main()
{
typedef void (firble::*FPTR) ();
FPTR x;
smartptr y;
(y->*x)(); // This is the interesting line.
return 0;
}
Compilation:
cc1plus test5.cc -quiet -dumpbase test5.cc -Wall -noreg -version -o test5.s
GNU C++ version 1.36.0- (based on GCC 1.36) (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
Assembly: (for a Sun 3)
#NO_APP
gcc_compiled.:
.text
.even
.globl _main
_main:
link a6,#-8
movel a2,sp@-
jbsr ___main
movel d0,d0
tstl a6@(-4)
jle L2 <------ test the high bit to see if this is virtual.
movel a6@(-4),a2
jra L3
L2: <------ only get here if x points to a virtual fn.
movel a6,d0
subql #8,d0
movel d0,sp@-
jbsr _op$component__8smartptre
addqw #4,sp
movel d0,a0
movel a6@(-4),d0
asll #3,d0
movel a0@(4),a1
movel a1@(4,d0:l),a2
L3:
movel a0,sp@-
jbsr a2@
clrl d0
jra L1
clrl d0
jra L1
L1:
movel a6@(-12),a2
unlk a6
rts
So the operator-> is only called if the pointer passed is to a virtual
function. This doesn't seem right, especially since a0 doesn't contain
anything interesting at L3 in the non-virtual case.
This happened in g++ 1.35 too. I hope it isn't a language feature.
Bryan Boreham bryan@kewill.uucp
Software Engineer || bryan%kewill@uunet.uu.net
Kewill Systems PLC || ... uunet!mcvax!ukc!root44!kewill!bryan
Walton-On-Thames
Surrey, England Telephone: (+44) 932 248 328