🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.g++.bug
Article #1783

bitwise copy bug

#1783
From: Drazen Borkovic
Date: Thu, 23 Mar 1989 21:44
302 lines
7446 bytes
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
Technical Details
Message-ID: <8903232144.AA05054@vlsi.caltech.edu>
Path: arc1-ca.pugleaf.net!utzoo!yunexus!telly!attcan!dptcdc!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!VLSI.CALTECH.EDU!drazen

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!yunexus!telly!attcan!dptcdc!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!VLSI.CALTECH.EDU!drazen
From: drazen@VLSI.CALTECH.EDU (Drazen Borkovic)
Newsgroups: gnu.g++.bug
Subject: bitwise copy bug
Message-ID: <8903232144.AA05054@vlsi.caltech.edu>
Date: 23 Mar 89 21:44:14 GMT
Article-I.D.: vlsi.8903232144.AA05054
Sender: daemon@tut.cis.ohio-state.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 302