| ! { dg-do run } |
| ! PR97063 - Wrong result for vector (step size is negative) * matrix |
| |
| program p |
| implicit none |
| integer, parameter :: m = 3, k = 2*m, l = k-1, n = 4 |
| integer :: i, j, m1, m2, ms |
| integer :: ai(k), bi(k,n), ci(n), ci_ref(n), c1, c2 |
| real :: ar(k), br(k,n), cr(n), cr_ref(n) |
| |
| ai(:) = [(i,i=0,k-1)] |
| bi(:,:) = reshape ([(((5*i+j),i=0,k-1),j=0,n-1)],[k,n]) |
| |
| ! Parameters of subscript triplet |
| m1 = 1; m2 = l; ms = 2 |
| |
| ! Reference values for cross-checks: integer variant |
| c1 = dot_product (ai(m1:m2: ms), bi(m1:m2: ms,1)) |
| c2 = dot_product (ai(m1:m2: ms), bi(m1:m2: ms,2)) |
| ci_ref = matmul (ai(m1:m2: ms), bi(m1:m2: ms,:)) |
| ci = matmul (ai(m2:m1:-ms), bi(m2:m1:-ms,:)) |
| |
| if (ci_ref(1) /= c1 .or. ci_ref(2) /= c2) stop 1 |
| if (any (ci /= ci_ref)) stop 2 |
| |
| ! Real variant |
| ar = real (ai) |
| br = real (bi) |
| cr_ref = matmul (ar(m1:m2: ms), br(m1:m2: ms,:)) |
| cr = matmul (ar(m2:m1:-ms), br(m2:m1:-ms,:)) |
| |
| if (any (cr_ref /= real (ci_ref))) stop 3 |
| if (any (cr /= cr_ref )) stop 4 |
| |
| ! Mixed variants |
| cr_ref = matmul (ar(m1:m2: ms), bi(m1:m2: ms,:)) |
| cr = matmul (ar(m2:m1:-ms), bi(m2:m1:-ms,:)) |
| |
| if (any (cr_ref /= real (ci_ref))) stop 5 |
| if (any (cr /= cr_ref )) stop 6 |
| |
| cr_ref = matmul (ai(m1:m2: ms), br(m1:m2: ms,:)) |
| cr = matmul (ai(m2:m1:-ms), br(m2:m1:-ms,:)) |
| |
| if (any (cr_ref /= real (ci_ref))) stop 7 |
| if (any (cr /= cr_ref )) stop 8 |
| end program |