rfg@MCC.COM (Ron Guilmette) (06/17/89)
As the following program demonstrates, g++ 1.35.0/sun3 handles inlining of member functions (whose bodies are contained within their containing class declaration) in a bass-akwards way. Specifically, if a given class declaration contains two member functions, and if one of these member functions is "inline" and if the other member function contains a call to the "inline" function, the call will *only* be inlined if the "inline" function appears *** after *** the body of the calling function!!!!!!! enilni The reason for this "enilni" feature has to do with the order in which g++ parses and compiles member functions. Apparently, member functions are "processed" by g++ in a "right-to-left" ordering, so that if you want a member function inlined everywhere, you should put it *last* in your class declaration, or better yet, place the body outside of the class declaration altogether. I have no idea how to fix this problem right now, but I hope that it will be fixed so that "inlining" will take place "as expected", i.e. in a top-to-bottom fashion, rather than in the current "bottom-to-top" fashion. // Ron Guilmette - MCC - Experimental Systems Kit Project // 3500 West Balcones Center Drive, Austin, TX 78759 - (512)338-3740 // ARPA: rfg@mcc.com // UUCP: {rutgers,uunet,gatech,ames,pyramid}!cs.utexas.edu!pp!rfg ---------------------------------------------------------------------- struct C { // If you reverse the order of the following two declarations, // you will get what you really wanted. inline void member_1 () { } inline void member_2 () { member_1 (); } }; main () { C c; c.member_2 (); } ------------------------------------------------------------------------ #NO_APP gcc_compiled.: .text .even _member_1_PSC: link a6,#0 movel a6@(8),d0 L4: unlk a6 rts .even .globl _main _main: link a6,#-4 moveml #0x3800,sp@- movel a6,d2 subql #2,d2 movel d2,d3 movel a6,d0 subql #2,d0 movel d3,d4 movel d4,sp@- jbsr _member_1_PSC <=== inlining failed here addqw #4,sp L6: L5: moveml a6@(-16),#0x1c unlk a6 rts