[Bug fortran/37099] New: Wrong results when comparing a character array to a character expression
dominiq at lps dot ens dot fr
gcc-bugzilla@gcc.gnu.org
Tue Aug 12 19:27:00 GMT 2008
When compiled with gfortran 4.3.1/4.4.0, the following code:
module xparams
integer,parameter :: exprbeg=100,exprend=154
character(*),dimension(exprbeg:exprend),parameter :: &
exprs=(/'nint() ','log10() ','sqrt() ','acos() ','asin() ', &
'atan() ','cosh() ','sinh() ','tanh() ','int() ', &
'cos() ','sin() ','tan() ','exp() ','log() ','abs() ',&
'delta() ','step() ','rect() ','max(,) ','min(,) ','bj0() ',&
'bj1() ','bjn(,) ','by0() ','by1() ','byn(,) ','logb(,) ',&
'erf() ','erfc() ','lgamma()','gamma() ','csch() ','sech() ',&
'coth() ','lif(,,) ','gaus() ','sinc() ','atan2(,)','mod(,) ',&
'nthrt(,)','ramp() ','fbi() ','fbiq() ','uran(,) ','aif(,,,)',&
'sgn() ','cbrt() ','fact() ','somb() ','bk0() ','bk1() ',&
'bkn(,) ','bbi(,,) ','bbiq(,,)'/)
logical :: tmp(55,26)
character(26) :: al = 'abcdefghijklmnopqrstuvwxyz'
end
program pack_bug
use xparams
do i = 1, 1
tmp(:,i) = (exprs(:)(1:1)==al(i:i))
print '(55L)', exprs(:)(1:1)=='a'
print '(55L)', tmp(:,i)
end do
end
gives
FFFTTTFFFFFFFFFTFFFFFFFFFFFFFFFFFFFFFFTFFFFFFTFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
The first line is the expected result, the second one is wrong.
See http://gcc.gnu.org/ml/fortran/2008-08/msg00057.html for the original post.
the dump original gives:
pack_bug ()
{
extern character(kind=1) al[1:26];
integer(kind=4) i;
extern logical(kind=4) tmp[1430];
static integer(kind=4) options.0[7] = {68, 127, 0, 0, 0, 1, 0};
_gfortran_set_options (7, (void *) &options.0);
i = 1;
if (i <= 1)
{
while (1)
{
{
logical(kind=4) D.1013;
{
integer(kind=4) D.992;
static character(kind=1)[1:8] * A.1[55] = {&"n"[1]{lb: 1 sz: 1},
&"l"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1 sz: 1}, &"a"[1]{lb: 1 sz: 1}, &"a"[1]{lb: 1
sz: 1}, &"a"[1]{lb: 1 sz: 1}, &"c"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1 sz: 1},
&"t"[1]{lb: 1 sz: 1}, &"i"[1]{lb: 1 sz: 1}, &"c"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1
sz: 1}, &"t"[1]{lb: 1 sz: 1}, &"e"[1]{lb: 1 sz: 1}, &"l"[1]{lb: 1 sz: 1},
&"a"[1]{lb: 1 sz: 1}, &"d"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1 sz: 1}, &"r"[1]{lb: 1
sz: 1}, &"m"[1]{lb: 1 sz: 1}, &"m"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1 sz: 1},
&"b"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1
sz: 1}, &"b"[1]{lb: 1 sz: 1}, &"l"[1]{lb: 1 sz: 1}, &"e"[1]{lb: 1 sz: 1},
&"e"[1]{lb: 1 sz: 1}, &"l"[1]{lb: 1 sz: 1}, &"g"[1]{lb: 1 sz: 1}, &"c"[1]{lb: 1
sz: 1}, &"s"[1]{lb: 1 sz: 1}, &"c"[1]{lb: 1 sz: 1}, &"l"[1]{lb: 1 sz: 1},
&"g"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1 sz: 1}, &"a"[1]{lb: 1 sz: 1}, &"m"[1]{lb: 1
sz: 1}, &"n"[1]{lb: 1 sz: 1}, &"r"[1]{lb: 1 sz: 1}, &"f"[1]{lb: 1 sz: 1},
&"f"[1]{lb: 1 sz: 1}, &"u"[1]{lb: 1 sz: 1}, &"a"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1
sz: 1}, &"c"[1]{lb: 1 sz: 1}, &"f"[1]{lb: 1 sz: 1}, &"s"[1]{lb: 1 sz: 1},
&"b"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1 sz: 1}, &"b"[1]{lb: 1
sz: 1}, &"b"[1]{lb: 1 sz: 1}};
D.992 = i;
{
integer(kind=4) D.994;
integer(kind=4) S.2;
D.994 = D.992 * 55 + -56;
S.2 = 1;
while (1)
{
if (S.2 > 55) goto L.3;
tmp[S.2 + D.994] = _gfortran_compare_string (8, A.1[S.2 +
-1], 1, (character(kind=1)[1:26] *) &al[i]{lb: 1 sz: 1}) == 0;
S.2 = S.2 + 1;
}
L.3:;
}
}
{
struct __st_parameter_dt dt_parm.3;
dt_parm.3.common.filename = &"pack_bug_red.f90"[1]{lb: 1 sz: 1};
dt_parm.3.common.line = 22;
dt_parm.3.format = &"(55L)"[1]{lb: 1 sz: 1};
dt_parm.3.format_len = 5;
dt_parm.3.common.flags = 4096;
dt_parm.3.common.unit = 6;
_gfortran_st_write (&dt_parm.3);
{
static logical(kind=4) A.4[55] = {0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
{
integer(kind=4) S.5;
S.5 = 0;
while (1)
{
if (S.5 > 54) goto L.4;
{
logical(kind=4) D.999;
D.999 = A.4[S.5];
_gfortran_transfer_logical (&dt_parm.3, &D.999, 4);
}
S.5 = S.5 + 1;
}
L.4:;
}
}
_gfortran_st_write_done (&dt_parm.3);
}
{
struct __st_parameter_dt dt_parm.6;
dt_parm.6.common.filename = &"pack_bug_red.f90"[1]{lb: 1 sz: 1};
dt_parm.6.common.line = 23;
dt_parm.6.format = &"(55L)"[1]{lb: 1 sz: 1};
dt_parm.6.format_len = 5;
dt_parm.6.common.flags = 4096;
dt_parm.6.common.unit = 6;
_gfortran_st_write (&dt_parm.6);
{
struct array1_logical(kind=4) parm.7;
integer(kind=4) D.1002;
D.1002 = i;
parm.7.dtype = 273;
parm.7.dim[0].lbound = 1;
parm.7.dim[0].ubound = 55;
parm.7.dim[0].stride = 1;
parm.7.data = (void *) &tmp[D.1002 * 55 + -55];
parm.7.offset = -56;
_gfortran_transfer_array (&dt_parm.6, &parm.7, 4, 0);
}
_gfortran_st_write_done (&dt_parm.6);
}
L.1:;
D.1013 = i == 1;
i = i + 1;
if (D.1013) goto L.2;
}
}
}
L.2:;
}
--
Summary: Wrong results when comparing a character array to a
character expression
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dominiq at lps dot ens dot fr
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37099
More information about the Gcc-bugs
mailing list