[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Does this indicate a bug of gcc version 3 ?



Please compile the following program by any of gcc version 3 and 
by gcc version 2.95, and run the program as follows.

	% gcc-3.3 -g -O0 this_program.c -o program_compiled_by_3.3
	% program_compiled_by_3.3
	First access
	loop-C 1422606 = &C[0][0][0][1][0] - &C0[0][0][0][1][0]
	loop-C 1422606 = &C[0][0][0][1][1] - &C0[0][0][0][1][1]
	...
	loop-B -134217962 = &C[0][1][0][0][2] - &C0[0][1][0][0][2]
	Second access
	%
	% gcc-2.95 -g -O0 this_program.c -o program_compiled_by_2.95
	% program_compiled_by_2.95
	First access
	Second access
	%

If the program is compiled by  gcc version 3, the program will 
outpur error messages which tell us that &C[i][j][k][l][m] is not
equal to &C0[i][j][k][l][m], but if gcc version 2.95 is used,
no such errors will occur; of course after C = C0 is excuted.


Does this indicate a bug in the Gcc version 3 or in my program?


===============

# Please compile the following program by
#	% gcc-3.3 -g -O0 this_program.c -o program_compiled_by_3.3
#	% program_compiled_by_3.3
#	First access
#	loop-C 1422606 = &C[0][0][0][1][0] - &C0[0][0][0][1][0]
#	...
#	Second access
#	% gcc-2.95 -g -O0 this_program.c -o program_compiled_by_2.95
#	% program_compiled_by_2.95
#	First access
#	Second access


#include	<stdio.h>

#define	LPMAX	1
#define	LEMAX	1
#define	KEMAX	1

int
main(void)
{
	int	lpmax = LPMAX;
	int	lemax = LEMAX;
	int	kemax = KEMAX;

	int	lp, mp, le, me, ke;
	int	kePkemax;

	int	status = 0;
	int	i;

	double	C0[lpmax + 1][lpmax + 1][lemax + 1][lemax + 1][kemax * 2 + 1];
	double	(*C)[lpmax + 1][lemax + 1][lemax + 1][kemax * 2 + 1];

	C = C0;

	fprintf(stderr,"First access\n");

	for ( lp = 0; lp <= lpmax; lp++ ) {
	    for ( mp = -lp; mp < 0; mp++ ) {
		for ( le = 0; le <= lemax; le++ ) {
		    for ( me = -le; me < 0; me++ ) {
			for ( ke = -kemax; ke <= kemax; ke++ ) {
				kePkemax = ke + kemax;

				i = &C[lp + mp][lp][le + me][le][kePkemax] - &C0[lp + mp][lp][le + me][le][kePkemax];
#ifndef	DEBUG
				if ( i != 0 )
#endif
					fprintf(stderr,"loop-A %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n", 
					i, lp + mp, lp, le + me, le, kePkemax,
					   lp + mp, lp, le + me, le, kePkemax);
			}
		    }
		    for ( me = 0; me <= le; me++ ) {
			for ( ke = -kemax; ke <= kemax; ke++ ) {
				kePkemax = ke + kemax;

				i = &C[lp + mp][lp][le][le - me][kePkemax] - &C0[lp + mp][lp][le][le - me][kePkemax];
#ifndef	DEBUG
				if ( i != 0 )
#endif
					fprintf(stderr,"loop-B %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n", 
					i, lp + mp, lp, le, le - me, kePkemax,
					   lp + mp, lp, le, le - me, kePkemax);
	
			}
		    }
		}
	    }
	    for ( mp = 0; mp <= lp; mp++ ) {
		for ( le = 0; le <= lemax; le++ ) {
		    for ( me = -le; me < 0; me++ ) {
			for ( ke = -kemax; ke <= kemax; ke++ ) {
				kePkemax = ke + kemax;

				i = &C[lp][lp - mp][le + me][le][kePkemax] - &C0[lp][lp - mp][le + me][le][kePkemax];
#ifndef	DEBUG
				if ( i != 0 )
#endif
					fprintf(stderr,"loop-C %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n", 
					i, lp, lp - mp, le + me, le, kePkemax,
					   lp, lp - mp, le + me, le, kePkemax);
			}
		    }
		    for ( me = 0; me <= le; me++ ) {
			for ( ke = -kemax; ke <= kemax; ke++ ) {
				kePkemax = ke + kemax;

				i = &C[lp][lp - mp][le][le - me][kePkemax] - &C0[lp][lp - mp][le][le - me][kePkemax];
#ifndef	DEBUG
				if ( i != 0 )
#endif
					fprintf(stderr,"loop-D %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n", 
					i, lp, lp - mp, le, le - me, kePkemax,
					   lp, lp - mp, le, le - me, kePkemax);
			}
		    }
		}
	    }
	}

	fprintf(stderr,"Second access\n");

	for ( lp = 0; lp <= lpmax; lp++ ) {
	    for ( mp = 0; mp <= lpmax; mp++ ) {
		for ( le = 0; le <= lemax; le++ ) {
		    for ( me = 0; me <= lemax; me++ ) {
			for ( ke = 0; ke <= kemax * 2; ke++ ) {

			    {
				int i;

				i = &C[lp][mp][le][me][ke] - &C0[lp][mp][le][me][ke];
#ifndef	DEBUG
				if ( i != 0 )
#endif
					fprintf(stderr,"loop   %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n", 
					i, lp, mp, le, me, ke,
					   lp, mp, le, me, ke);
			    }
			}
		    }
		}
	    }
	}

	return(status);
}



Reply to: