drazen@VLSI.CALTECH.EDU (Drazen Borkovic) (03/24/89)
One of the members of the class "classB" is "a" which is of type "classA". "classA" itself declares an assignment operator. In the function "func", there is a single statement (assignment "b = classB (p)"). The number of times that the constructor "classB::classB(struct X*)" is called depends on the number of members of "classB". Everything else is same. Below are two assembly outputs. CC complains that bitwise copy of "classB" is not allowed since it has a member with defined assignment operator. ================================================================== Script started on Tue Mar 21 16:48:23 1989 !35 juno:c++ -> cat bug.c struct X{ int xc; }; class classA { int i; public: classA& operator= (classA&); }; class classB { int k; #if MANY /* in first case MANY=0, in second MANY=1 */ int kk; int kkk; int kkkk; int j; int jj; int jjj; int jjjj; classA a; /* operator= is defined for classA */ #endif classA aa; /* but not for classB */ public: classB(struct X *); }; classB::classB (struct X* x) { if (x) k = x->xc; } classB b ( (struct X*) 0); void func ( struct X* p) { b = classB (p); /* constructor for classB */ } !36 juno:c++ -> g++ -v -S -DMANY=1 -o bug1.s bug.c g++ -v -S -DMANY=1 -o bug1.s bug.c g++ version 1.34.1 /usr/local/lib/gcc-cpp -+ -v -DMANY=1 -undef -D__GNU__ -D__GNUG__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Wall -D__HAVE_68881__ -Dmc68020 bug.c /tmp/cca23880.cpp GNU CPP version 1.34 /usr/local/lib/gcc-c++ /tmp/cca23880.cpp -quiet -dumpbase bug.c -Wall -Wwrite-strings -version -o bug1.s GNU C++ version 1.34.1 (68k, MIT syntax) compiled by GNU C version 1.34. !37 juno:c++ -> g++ -v -S -DMANY=0 -o bug0.s bug.c g++ version 1.34.1 /usr/local/lib/gcc-cpp -+ -v -DMANY=0 -undef -D__GNU__ -D__GNUG__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -Wall -D__HAVE_68881__ -Dmc68020 bug.c /tmp/cca23883.cpp GNU CPP version 1.34 /usr/local/lib/gcc-c++ /tmp/cca23883.cpp -quiet -dumpbase bug.c -Wall -Wwrite-strings -version -o bug0.s GNU C++ version 1.34.1 (68k, MIT syntax) compiled by GNU C version 1.34. !38 juno:c++ -> cat bug1.s #NO_APP gcc_compiled.: .text .even .globl _classB_PSclassB_PSX _classB_PSclassB_PSX: link a6,#0 tstl a6@(8) jne L3 pea 40:w jbsr ___builtin_new movel d0,a6@(8) addqw #4,sp L3: tstl a6@(12) jeq L2 movel a6@(8),a0 movel a6@(12),a1 movel a1@,a0@ L2: movel a6@(8),d1 movel d1,d0 jra L1 L1: unlk a6 rts .even .globl _func _func: link a6,#-400 movel a6@(8),sp@- moveq #-40,d0 addl a6,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 moveq #-40,d0 addl a6,d0 moveq #36,d1 addl d1,d0 movel d0,sp@- moveq #36,d0 addl #_b,d0 movel d0,sp@- jbsr _op$assign_nop_expr_PSclassA_SclassA movel a6@(8),sp@- moveq #-80,d0 addl a6,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 moveq #-80,d0 addl a6,d0 moveq #32,d1 addl d1,d0 movel d0,sp@- moveq #32,d0 addl #_b,d0 movel d0,sp@- jbsr _op$assign_nop_expr_PSclassA_SclassA addw #32,sp movel a6@(8),sp@- moveq #-120,d0 addl a6,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-92),_b+28 movel a6@(8),sp@- movel a6,d0 addl #-160,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-136),_b+24 movel a6@(8),sp@- movel a6,d0 addl #-200,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-180),_b+20 movel a6@(8),sp@- movel a6,d0 addl #-240,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-224),_b+16 addw #32,sp movel a6@(8),sp@- movel a6,d0 addl #-280,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-268),_b+12 movel a6@(8),sp@- movel a6,d0 addl #-320,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-312),_b+8 movel a6@(8),sp@- movel a6,d0 addl #-360,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-356),_b+4 movel a6@(8),sp@- movel a6,d0 addl #-400,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-400),d0 movel d0,_b addw #32,sp L4: unlk a6 rts .even .globl __GLOBAL_$I$bug_c __GLOBAL_$I$bug_c: link a6,#0 clrl sp@- pea _b jbsr _classB_PSclassB_PSX addqw #8,sp L5: unlk a6 rts .globl _b .data .even _b: .skip 40 !39 juno:c++ -> ^1^0 cat bug0.s #NO_APP gcc_compiled.: .text .even .globl _classB_PSclassB_PSX _classB_PSclassB_PSX: link a6,#0 tstl a6@(8) jne L3 pea 8:w jbsr ___builtin_new movel d0,a6@(8) addqw #4,sp L3: tstl a6@(12) jeq L2 movel a6@(8),a0 movel a6@(12),a1 movel a1@,a0@ L2: movel a6@(8),d1 movel d1,d0 jra L1 L1: unlk a6 rts .even .globl _func _func: link a6,#-16 movel a6@(8),sp@- movel a6,d0 subql #8,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6,d0 subql #8,d0 addql #4,d0 movel d0,sp@- movel #_b,d0 addql #4,d0 movel d0,sp@- jbsr _op$assign_nop_expr_PSclassA_SclassA movel a6@(8),sp@- moveq #-16,d0 addl a6,d0 movel d0,sp@- jbsr _classB_PSclassB_PSX movel d0,d0 movel a6@(-16),d0 movel d0,_b addw #24,sp L4: unlk a6 rts .even .globl __GLOBAL_$I$bug_c __GLOBAL_$I$bug_c: link a6,#0 clrl sp@- pea _b jbsr _classB_PSclassB_PSX addqw #8,sp L5: unlk a6 rts .globl _b .data .even _b: .skip 8 !40 juno:c++ -> exit script done on Tue Mar 21 16:49:55 1989 ====================================================================== Drazen Borkovic Caltech, CS dept. 256-80 Pasadena, CA 91125