| ! { dg-do run } |
| ! { dg-options "-fdec" } |
| ! |
| ! Runtime tests to verify bitwise ops perform appropriate conversions |
| ! with -fdec. |
| ! |
| |
| subroutine assert(expected, actual, str) |
| implicit none |
| character(*), intent(in) :: str |
| integer, intent(in) :: expected, actual(9) |
| integer :: i |
| do i=1,9 |
| if (expected .ne. actual(i)) then |
| write (*, '(A,I8,I8)') str, expected, actual(i) |
| STOP 1 |
| endif |
| enddo |
| end subroutine |
| |
| implicit none |
| |
| logical(1), volatile :: op1_1l |
| integer(1), volatile :: op1_1, op2_1 |
| |
| logical(2), volatile :: op1_2l |
| integer(2), volatile :: op1_2, op2_2 |
| |
| logical(4), volatile :: op1_4l |
| integer(4), volatile :: op1_4, op2_4 |
| |
| integer, volatile :: expect, outs(9) |
| |
| |
| op1_1l = .true. |
| op1_2l = .true. |
| op1_4l = .true. |
| op1_1 = 117_1 |
| op1_2 = 117_2 |
| op1_4 = 117_4 |
| op2_1 = 49_1 |
| op2_2 = 49_2 |
| op2_4 = 49_4 |
| |
| !!! Explicit integer operands |
| |
| expect = IAND(op1_1, op2_1) |
| outs(1) = op1_1 .AND. op2_1 |
| outs(2) = op1_1 .AND. op2_2 |
| outs(3) = op1_1 .AND. op2_4 |
| outs(4) = op1_2 .AND. op2_1 |
| outs(5) = op1_2 .AND. op2_2 |
| outs(6) = op1_2 .AND. op2_4 |
| outs(7) = op1_4 .AND. op2_1 |
| outs(8) = op1_4 .AND. op2_2 |
| outs(9) = op1_4 .AND. op2_4 |
| call assert(expect, outs, "AND") |
| |
| expect = IOR(op1_1, op2_1) |
| outs(1) = op1_1 .OR. op2_1 |
| outs(2) = op1_1 .OR. op2_2 |
| outs(3) = op1_1 .OR. op2_4 |
| outs(4) = op1_2 .OR. op2_1 |
| outs(5) = op1_2 .OR. op2_2 |
| outs(6) = op1_2 .OR. op2_4 |
| outs(7) = op1_4 .OR. op2_1 |
| outs(8) = op1_4 .OR. op2_2 |
| outs(9) = op1_4 .OR. op2_4 |
| |
| call assert(expect, outs, "OR") |
| |
| expect = NOT(IEOR(op1_1, op2_1)) |
| outs(1) = op1_1 .EQV. op2_1 |
| outs(2) = op1_1 .EQV. op2_2 |
| outs(3) = op1_1 .EQV. op2_4 |
| outs(4) = op1_2 .EQV. op2_1 |
| outs(5) = op1_2 .EQV. op2_2 |
| outs(6) = op1_2 .EQV. op2_4 |
| outs(7) = op1_4 .EQV. op2_1 |
| outs(8) = op1_4 .EQV. op2_2 |
| outs(9) = op1_4 .EQV. op2_4 |
| |
| call assert(expect, outs, "EQV") |
| |
| expect = IEOR(op1_1, op2_1) |
| outs(1) = op1_1 .NEQV. op2_1 |
| outs(2) = op1_1 .NEQV. op2_2 |
| outs(3) = op1_1 .NEQV. op2_4 |
| outs(4) = op1_2 .NEQV. op2_1 |
| outs(5) = op1_2 .NEQV. op2_2 |
| outs(6) = op1_2 .NEQV. op2_4 |
| outs(7) = op1_4 .NEQV. op2_1 |
| outs(8) = op1_4 .NEQV. op2_2 |
| outs(9) = op1_4 .NEQV. op2_4 |
| |
| call assert(expect, outs, "NEQV") |
| |
| !!! Logical -> Integer operand conversions |
| op1_1 = op1_1l |
| op1_2 = op1_2l |
| op1_4 = op1_4l |
| |
| expect = IAND(op1_1, op2_1) |
| outs(1) = op1_1l .AND. op2_1 ! implicit conversions |
| outs(2) = op1_1l .AND. op2_2 |
| outs(3) = op1_1l .AND. op2_4 |
| outs(4) = op1_2l .AND. op2_1 |
| outs(5) = op1_2l .AND. op2_2 |
| outs(6) = op1_2l .AND. op2_4 |
| outs(7) = op1_4l .AND. op2_1 |
| outs(8) = op1_4l .AND. op2_2 |
| outs(9) = op1_4l .AND. op2_4 |
| call assert(expect, outs, "AND") |
| |
| expect = IOR(op1_1, op2_1) |
| outs(1) = op1_1l .OR. op2_1 ! implicit conversions |
| outs(2) = op1_1l .OR. op2_2 |
| outs(3) = op1_1l .OR. op2_4 |
| outs(4) = op1_2l .OR. op2_1 |
| outs(5) = op1_2l .OR. op2_2 |
| outs(6) = op1_2l .OR. op2_4 |
| outs(7) = op1_4l .OR. op2_1 |
| outs(8) = op1_4l .OR. op2_2 |
| outs(9) = op1_4l .OR. op2_4 |
| |
| call assert(expect, outs, "OR") |
| |
| expect = NOT(IEOR(op1_1, op2_1)) |
| outs(1) = op1_1l .EQV. op2_1 ! implicit conversions |
| outs(2) = op1_1l .EQV. op2_2 |
| outs(3) = op1_1l .EQV. op2_4 |
| outs(4) = op1_2l .EQV. op2_1 |
| outs(5) = op1_2l .EQV. op2_2 |
| outs(6) = op1_2l .EQV. op2_4 |
| outs(7) = op1_4l .EQV. op2_1 |
| outs(8) = op1_4l .EQV. op2_2 |
| outs(9) = op1_4l .EQV. op2_4 |
| |
| call assert(expect, outs, "EQV") |
| |
| expect = IEOR(op1_1, op2_1) |
| outs(1) = op1_1l .NEQV. op2_1 ! implicit conversions |
| outs(2) = op1_1l .NEQV. op2_2 |
| outs(3) = op1_1l .NEQV. op2_4 |
| outs(4) = op1_2l .NEQV. op2_1 |
| outs(5) = op1_2l .NEQV. op2_2 |
| outs(6) = op1_2l .NEQV. op2_4 |
| outs(7) = op1_4l .NEQV. op2_1 |
| outs(8) = op1_4l .NEQV. op2_2 |
| outs(9) = op1_4l .NEQV. op2_4 |
| |
| call assert(expect, outs, "NEQV") |
| |
| |
| end |