[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