blob: 6ada8d7d993dd0207d71f4ec46f883086b25ecc0 [file] [log] [blame]
! { dg-do run }
! { dg-options "-fdec" }
!
! Runtime tests to verify logical-to-bitwise operations perform as expected
! with -fdec.
!
subroutine assert(expected, actual, str)
implicit none
character(*), intent(in) :: str
integer, intent(in) :: expected, actual
if (actual .ne. expected) then
write (*, '(A,I4,I4)') str, expected, actual
STOP 1
endif
end subroutine
implicit none
integer expected, expected_expr
integer output_vars, output_const, output_expr
integer op1, op2, mult
mult = 3
op1 = 3
op2 = 5
!!!! AND -> IAND
expected = IAND(op1, op2)
expected_expr = mult*expected
output_const = 3 .AND. 5
output_vars = op1 .AND. op2
output_expr = mult * (op1 .AND. op2)
call assert(expected, output_vars, "( ) and")
call assert(expected, output_const, "(c) and")
call assert(expected_expr, output_expr, "(x) and")
!!!! EQV -> NOT IEOR
expected = NOT(IEOR(op1, op2))
expected_expr = mult*expected
output_const = 3 .EQV. 5
output_vars = op1 .EQV. op2
output_expr = mult * (op1 .EQV. op2)
call assert(expected, output_vars, "( ) EQV")
call assert(expected, output_const, "(c) EQV")
call assert(expected_expr, output_expr, "(x) EQV")
!!!! NEQV -> IEOR
expected = IEOR(op1, op2)
expected_expr = mult*expected
output_const = 3 .NEQV. 5
output_vars = op1 .NEQV. op2
output_expr = mult * (op1 .NEQV. op2)
call assert(expected, output_vars, "( ) NEQV")
call assert(expected, output_const, "(c) NEQV")
call assert(expected_expr, output_expr, "(x) NEQV")
!!!! NOT -> NOT
expected = NOT(op2)
expected_expr = mult*expected
output_const = .NOT. 5
output_vars = .NOT. op2
output_expr = mult * (.NOT. op2)
call assert(expected, output_vars, "( ) NOT")
call assert(expected, output_const, "(c) NOT")
call assert(expected_expr, output_expr, "(x) NOT")
!!!! OR -> IOR
expected = IOR(op1, op2)
expected_expr = mult*expected
output_const = 3 .OR. 5
output_vars = op1 .OR. op2
output_expr = mult * (op1 .OR. op2)
call assert(expected, output_vars, "( ) OR")
call assert(expected, output_const, "(c) OR")
call assert(expected_expr, output_expr, "(x) OR")
!!!! XOR -> IEOR, not to be confused with .XOR.
expected = IEOR(op1, op2)
expected_expr = mult*expected
output_const = 3 .XOR. 5
output_vars = op1 .XOR. op2
output_expr = mult * (op1 .XOR. op2)
call assert(expected, output_vars, "( ) XOR")
call assert(expected, output_const, "(c) XOR")
call assert(expected_expr, output_expr, "(x) XOR")
end