[gnu.g++.bug] bug evaluating "/"

tuck@CS.UNC.EDU (Russ Tuck) (07/07/89)

Return-Receipt-To: tuck@cs.unc.edu

Enclosed is a shar file.  The bug report is in the leading comment of the .c
file (tuck0.c), and includes my address.

Since I haven't found a work-around yet, I'd appreciate any advice, comments,
work-arounds or fix.

I appreciate all the good work that has gone into developing g++.

	Russ

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	tuck0.c
#	tuck0.s
#	tuck0.script
# This archive created: Thu Jul  6 15:55:49 1989
# By:	Russ Tuck ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'tuck0.c'" '(1627 characters)'
if test -f 'tuck0.c'
then
	echo shar: will not over-write existing file "'tuck0.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'tuck0.c'
 X/* G++ bug report.
 X   This is file "tuck0.c".
 X   Submitted by:
 X	Russ Tuck		               internet: tuck@cs.unc.edu
 X	Computer Science Dept., Sitterson Hall csnet:    tuck@unc
 X	University of North Carolina           uucp:     ...!mcnc!unc!tuck
 X	Chapel Hill, NC 27599-3175, USA        Phone: (919)962-1755 or 962-1932
 X   g++ version: 1.35.1-
 X   cpu: Sun-4/280 (sparc)
 X   os: SunOS Sys4-3.2
 X   date: 6 July 1989
 X   Summary:
 X     1) Particular expressions involving division (/) are sometimes evaluated
 X        incorrectly at run time.  (It appears to me that reg %o1 is not being
 X	set before calling .div; it sometimes happens to have the right value.)
 X     2) g++ -O tuck0.c gets "fatal signal 4" in cc1plus
 X	
 X   I have not found a work-around yet.
 X
 X   Enclosures:
 X     tuck0.s		-- assembler output from "g++ -g -S tuck0.c".
 X     tuck0.script	-- script showing compile and run of tuck0.c
 X*/
 X
 X#include <stdio.h>
 X
 Xmain()
 X{
 X  printf("(5 + 32) / 32 evaluates to %d.\n", (5 + 32) / 32);
 X  int ti = 32;
 X  printf("(5 + ti) / ti evaluates to %d.\n", (5 + ti) / ti);
 X  printf("(5 + ti) / ti evaluates to %d.\n", (5 + ti) / ti);
 X  unsigned tu = 32;
 X  printf("(5 + tu) / tu evaluates to %u.\n", (5 + tu) / tu);
 X  printf("(5 + tu) / tu evaluates to %u.\n", (5 + tu) / tu);
 X
 X  printf("37 / 32 evaluates to %d.\n", 37 / 32);
 X  printf("37 / tu evaluates to %u.\n", 37 / tu);
 X  printf("37 / tu evaluates to %u.\n", 37 / tu);
 X  printf("37 / ti evaluates to %d.\n", 37 / ti);
 X  printf("37 / ti evaluates to %d.\n", 37 / ti);
 X
 X  int ti0 = 32;
 X  int ti1 = 5 + ti0;
 X  int ti2 = ti1 / ti0;
 X  printf("ti0 = %d, ti1 = %d, ti2 = %d\n", ti0, ti1, ti2);
 X}
SHAR_EOF
if test 1627 -ne "`wc -c < 'tuck0.c'`"
then
	echo shar: error transmitting "'tuck0.c'" '(should have been 1627 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'tuck0.s'" '(3557 characters)'
if test -f 'tuck0.s'
then
	echo shar: will not over-write existing file "'tuck0.s'"
else
sed 's/^ X//' << \SHAR_EOF > 'tuck0.s'
 Xgcc_compiled.:
 X	.stabs "tuck0.c",100,0,0,Ltext
 XLtext:
 X.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
 X.stabs "char:t2=r2;0;127;",128,0,0,0
 X.stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0
 X.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
 X.stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0
 X.stabs "short int:t6=r1;-32768;32767;",128,0,0,0
 X.stabs "long long int:t7=r1;0;-1;",128,0,0,0
 X.stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
 X.stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0
 X.stabs "signed char:t10=r1;-128;127;",128,0,0,0
 X.stabs "unsigned char:t11=r1;0;255;",128,0,0,0
 X.stabs "float:t12=r1;4;0;",128,0,0,0
 X.stabs "double:t13=r1;8;0;",128,0,0,0
 X.stabs "long double:t14=r1;8;0;",128,0,0,0
 X.stabs "void:t15=15",128,0,0,0
 X.stabs "$vtbl_ptr_type:t16=s8delta:/26,0,16;index:/26,16,16;pfn:/217=*15,32,32;delta2:/26,32,16;;~;",128,0,0,0
 X.text
 XLC0:
 X	.ascii "(5 + 32) / 32 evaluates to %d.\12\0"
 XLC1:
 X	.ascii "(5 + ti) / ti evaluates to %d.\12\0"
 XLC2:
 X	.ascii "(5 + tu) / tu evaluates to %u.\12\0"
 XLC3:
 X	.ascii "37 / 32 evaluates to %d.\12\0"
 XLC4:
 X	.ascii "37 / tu evaluates to %u.\12\0"
 XLC5:
 X	.ascii "37 / ti evaluates to %d.\12\0"
 XLC6:
 X	.ascii "ti0 = %d, ti1 = %d, ti2 = %d\12\0"
 X	.align 4
 X.global _main
 X	.proc 1
 X_main:
 X.stabn 68,0,28,LM1
 XLM1:
 X	!#PROLOGUE# 0
 X	save %sp,-152,%sp
 X	!#PROLOGUE# 1
 XLBB2:
 X.stabn 68,0,29,LM2
 XLM2:
 X	sethi %hi(LC0),%o0
 X	or %lo(LC0),%o0,%o0
 X	mov 1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,30,LM3
 XLM3:
 X	mov 32,%o4
 X	st %o4,[%fp-20]
 X.stabn 68,0,31,LM4
 XLM4:
 X	ld [%fp-20],%o0
 X	add %o0,5,%o0
 X	call .div,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC1),%o0
 X	or %lo(LC1),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,32,LM5
 XLM5:
 X	ld [%fp-20],%o0
 X	add %o0,5,%o0
 X	call .div,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC1),%o0
 X	or %lo(LC1),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,33,LM6
 XLM6:
 X	mov 32,%o4
 X	st %o4,[%fp-28]
 X.stabn 68,0,34,LM7
 XLM7:
 X	ld [%fp-28],%o0
 X	add %o0,5,%o0
 X	call .udiv,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC2),%o0
 X	or %lo(LC2),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,35,LM8
 XLM8:
 X	ld [%fp-28],%o0
 X	add %o0,5,%o0
 X	call .udiv,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC2),%o0
 X	or %lo(LC2),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,37,LM9
 XLM9:
 X	sethi %hi(LC3),%o0
 X	or %lo(LC3),%o0,%o0
 X	mov 1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,38,LM10
 XLM10:
 X	call .udiv,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC4),%o0
 X	or %lo(LC4),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,39,LM11
 XLM11:
 X	call .udiv,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC4),%o0
 X	or %lo(LC4),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,40,LM12
 XLM12:
 X	call .div,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC5),%o0
 X	or %lo(LC5),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,41,LM13
 XLM13:
 X	call .div,0
 X	nop
 X	mov %o0,%o1
 X	sethi %hi(LC5),%o0
 X	or %lo(LC5),%o0,%o0
 X	mov %o1,%o1
 X	call _printf,0
 X	nop
 X.stabn 68,0,43,LM14
 XLM14:
 X	mov 32,%o4
 X	st %o4,[%fp-36]
 X.stabn 68,0,44,LM15
 XLM15:
 X	ld [%fp-36],%o0
 X	add %o0,5,%o0
 X	st %o0,[%fp-44]
 X.stabn 68,0,45,LM16
 XLM16:
 X	call .div,0
 X	nop
 X	mov %o0,%o0
 X	st %o0,[%fp-52]
 X.stabn 68,0,46,LM17
 XLM17:
 X	sethi %hi(LC6),%o0
 X	or %lo(LC6),%o0,%o0
 X	ld [%fp-36],%o1
 X	ld [%fp-44],%o2
 X	ld [%fp-52],%o3
 X	call _printf,0
 X	nop
 XLBE2:
 X.stabn 68,0,47,LM18
 XLM18:
 XL1:
 X	ret
 X	restore
 X.stabs "_iobuf:T18=s20_cnt:/21,0,32;_ptr:/219=*2,32,32;_base:/219,64,32;_bufsiz:/21,96,32;_flag:/26,128,16;_file:/22,144,8;;~;",128,0,0,0
 X.stabs "_iobuf:t18",128,0,0,0
 X.stabs "main:F1",36,0,0,_main
 X.stabs "ti:1",128,0,0,-20
 X.stabs "tu:4",128,0,0,-28
 X.stabs "ti0:1",128,0,0,-36
 X.stabs "ti1:1",128,0,0,-44
 X.stabs "ti2:1",128,0,0,-52
 X.stabn 192,0,0,LBB2
 X.stabn 224,0,0,LBE2
SHAR_EOF
if test 3557 -ne "`wc -c < 'tuck0.s'`"
then
	echo shar: error transmitting "'tuck0.s'" '(should have been 3557 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'tuck0.script'" '(1614 characters)'
if test -f 'tuck0.script'
then
	echo shar: will not over-write existing file "'tuck0.script'"
else
sed 's/^ X//' << \SHAR_EOF > 'tuck0.script'
 XScript started on Thu Jul  6 15:46:01 1989
 Xtuck@jason> g++ -g tuck0.c
 Xtuck@jason> a.out
 X(5 + 32) / 32 evaluates to 1.
 X(5 + ti) / ti evaluates to 37.
 X(5 + ti) / ti evaluates to 1.
 X(5 + tu) / tu evaluates to 37.
 X(5 + tu) / tu evaluates to 1.
 X37 / 32 evaluates to 1.
 X37 / tu evaluates to 24.
 X37 / tu evaluates to 1.
 X37 / ti evaluates to 24.
 X37 / ti evaluates to 1.
 Xti0 = 32, ti1 = 37, ti2 = 37
 Xtuck@jason> g++ -O tuck0.c
 Xg++: Program cc1plus got fatal signal 4.
 Xtuck@jason> g++ -v -g tuck0.c
 Xg++ version 1.35.1-
 X /mu/hedlund1/gnu/lib/SUN4/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ tuck0.c /tmp/cca09872.cpp
 XGNU CPP version 1.35
 X /mu/hedlund1/gnu/lib/SUN4/gcc-cc1plus /tmp/cca09872.cpp -quiet -dumpbase tuck0.c -noreg -version -G -o /tmp/cca09872.s
 XGNU C++ version 1.35.1- (sparc) compiled by GNU C version 1.35.
 X as /tmp/cca09872.s -o tuck0.o
 X /mu/hedlund1/gnu/lib/SUN4/gcc-ld++ -C /mu/hedlund1/gnu/lib/SUN4/gcc-crt0+.o tuck0.o -lg++ /mu/hedlund1/gnu/lib/SUN4/gcc-gnulib -lg -lc
 Xtuck@jason> echo "CC (AT&T cfront 1.2.1) gives correct output"
 XCC (AT&T cfront 1.2.1) gives correct output
 Xtuck@jason> CC tuck0.c
 Xtuck@jason> a.out
 X(5 + 32) / 32 evaluates to 1.
 X(5 + ti) / ti evaluates to 1.
 X(5 + ti) / ti evaluates to 1.
 X(5 + tu) / tu evaluates to 1.
 X(5 + tu) / tu evaluates to 1.
 X37 / 32 evaluates to 1.
 X37 / tu evaluates to 1.
 X37 / tu evaluates to 1.
 X37 / ti evaluates to 1.
 X37 / ti evaluates to 1.
 Xti0 = 32, ti1 = 37, ti2 = 1
 Xtuck@jason> g++ -g -S tuck0.c
 Xtuck@jason> ^D
 Xscript done on Thu Jul  6 15:48:22 1989
SHAR_EOF
if test 1614 -ne "`wc -c < 'tuck0.script'`"
then
	echo shar: error transmitting "'tuck0.script'" '(should have been 1614 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0