[gnu.g++.bug] bitwise copy bug

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