$ cat logic.f90
program main
  implicit none
  logical(kind=4) :: lo1, lo2
  integer(kind=4) :: in, i
  equivalence(lo1, in)
  do i=0,4
    in = i
    call settrue(lo2)
    print *,i, lo1 , lo1 .eqv. lo2, lo1 .eqv. .true.
  end do
end program main

subroutine settrue(lo)
  logical(kind=4) :: lo
  lo = .true.
end subroutine
$ gfortran --std=f95 logic.f90
$ ./a.out
           0 F F F
           1 T T T
           2 T F T
           3 T F T
           4 T F T
$ gfortran -v
Using built-in specs.
Target: ia64-unknown-linux-gnu
Configured with: ../gcc-4.1-20050709/configure --prefix=/home/zfkts --enable-
languages=c,f95
Thread model: posix
gcc version 4.1.0 20050709 (experimental)

The first .eqv. is translated into a check for equality

            {
              logical4 D.573;

              D.573 = equiv.0.lo1 == lo2;
              _gfortran_transfer_logical (&D.573, 4);
            }

the second one is removed.

Do we care?  Equivalencing integer and logical is prohibited
(although we don't warn about this with --std=f95; maybe
that is the error).

-- 
           Summary: Different ideas about .true. and .false.
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: tkoenig at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22495

Reply via email to