! { 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 call abort() 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