[gnu.g++.bug] BUG in default memwise assignment

jj@idris.id.dk (Jesper Joergensen [ris]) (02/14/90)

Here is another BUG report, it seems that I am having a bad day ...


ENVIRONMENT
===========

    Compiler:	G++	version 1.36.4	(configured for 'vax')
    Back-end:	GCC	version 1.36.93	(configured for 'vax')
    System:	Ultrix	version 2.2-1 Worksystem v1.1 System #2
    Machine:	DEC VAXstation 2000


SUMMARY
=======

    The compiler gets a fatal signal 4 (illegal instruction) when using the
    default memberwise semantics of operator=. It seems that abort() is
    called directly from the compiler code (confer GDB session at end).


EXAMPLE PROGRAM
===============

***** START *****
class Base {
  int member ;
public:
  Base(int member1) { member = member1 ; }
  Base(const Base &x) { member = x.member ; }
  Base operator=(const Base &x) { member = x.member ; return *this ; }
} ;

class Derived : Base {
public:
  Derived(int member1) : Base(member1) { }
} ;

int main(int argc, const char *argv) {
  Derived x(2) ;
  Derived y(3) ;

  Derived z(x) ;			// memberwise initialisation works OK
  y = z ;				// memberwise assignment causes abort()

  return 0 ;
}
****** END ******

The offending line is the one containing 'y = z ;'. If is commented out th
compilation succeeds with correct code, hence the default memberwise
initialisation of 'z' with 'x' in 'Derived z(x) ;' seems to be OK.


GDB LISTING
===========

Below is an emacs-logged GDB session, which should help you locate the call to
abort() from within the compiler's code. It seems that one of your invariants
has blown.

***** GDB SESSION START *****
% pwd
/usr/users/jj/GNUmail/g++errs
% gdb ~/install/g++/cc1plus
GDB 3.4, Copyright (C) 1989 Free Software Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /usr/users/jj/install/g++/cc1plus...done.
Type "help" for a list of commands.
(gdb) set args memwise.E -quiet -dumpbase memwise.cc -mgnu -version -o memwise.s
(gdb) info files
Executable file "/usr/users/jj/install/g++/cc1plus".
No core dump file
Symbols from "/usr/users/jj/install/g++/cc1plus".
Text segment in executable from 0x0 to 0x92400.
Data segment in executable from 0x92400 to 0x94800.
(gdb) dir ~/install/g++
Source directories searched: /usr/users/jj/GNUmail/g++errs:/usr/users/jj/install/g++
(gdb) run
Starting program: /usr/users/jj/install/g++/cc1plus memwise.E -quiet -dumpbase memwise.cc -mgnu -version -o memwise.s
GNU C++ version 1.36.4 (based on GCC 1.36.93) (vax) compiled by GNU C version 1.36.93.
default target switches: -munix

Program received signal 4, Illegal instruction
0x8fdea in abort ()
(gdb) info stac
#0  0x8fdea in abort ()
#1  0x64eff in copy_rtx_and_substitute (...) (...)
#2  0x6562f in copy_rtx_and_substitute (...) (...)
#3  0x64a23 in expand_inline_function (...) (...)
#4  0x517d9 in expand_call (...) (...)
#5  0x4fc0c in expand_expr (...) (...)
#6  0x537ce in expand_expr_stmt (...) (...)
#7  0x36af1 in expand_cplus_expr_stmt (...) (...)
#8  0xa633 in yyparse (...) (...)
#9  0x435a5 in compile_file (name=(char *) 0x7fffe26a "memwise.E") (toplev.c line 1250)
#10 0x44b00 in main (argc=9, argv=(char **) 0x7fffe1e8, envp=(char **) 0x7fffe210) (toplev.c line 2238)
(gdb) list *0x64eff
Reading in symbols for integrate.c...done.
0x64eff is in copy_rtx_and_substitute (integrate.c, line 1479).
1474			 If it does, it may not be the same mode as `inline_target'
1475			 because SUBREG is not required for hard regs.
1476			 If not, adjust mode of inline_target to fit the context.  */
1477		      if (inline_target == 0)
1478			abort ();
1479		      if (mode == GET_MODE (inline_target))
1480			return inline_target;
1481		      return gen_rtx (SUBREG, mode, inline_target, 0);
1482		    }
1483		  if (regno == FRAME_POINTER_REGNUM)
(gdb) 
****** GDB SESSION END ******

The rest is up to you, good luck !!

	Jesper Jorgensen	jj@idris.id.dk

	Research associate
	Department of Computer Science
	Technical University of Denmark
	DK-2800 Lyngby
	DENMARK