1!{ dg-do run }
2! Test MATMUL for various arguments and results
3! (test values checked with GNU octave).
4! PR18857 was due to an incorrect assertion that component base==0
5! for both input arguments and the result.
6! provided by Paul Thomas - pault@gcc.gnu.org
7
8Program matmul_1
9  integer, parameter                                :: N = 5
10  integer, parameter                                :: T = 4
11  integer                                           :: i
12  real(kind=T), dimension(:,:), allocatable         :: a, b, c
13  real(kind=T), dimension(N,N)                      :: x, y, z
14
15  allocate (a(2*N, N), b(N, N), c(2*N, N))
16
17  do i = 1, 2*N
18    a(i, :) = real (i)
19  end do
20  b = 4.0_T
21
22  do i = 1, N
23    x(i, :) = real (i)
24  end do
25  y = 2.0_T
26
27!                           whole array
28
29  z = 0.0_T
30  z = matmul (x, y)
31  if (sum (z) /= 750.0_T) STOP 1
32
33!                           array sections
34
35  c = 0.0_T
36  c(1:3,1:2) = matmul (a(7:9,3:N), b(3:N,3:4))
37  if (sum (c) /= 576.0_T) STOP 2
38
39!                           uses a temp
40
41  c = 0.0_T
42  c = matmul (a, b + x)
43  if (sum (c) /= 9625.0_T) STOP 3
44
45!                           returns to a temp
46
47  c = 0.0_T
48  c = a + matmul (a, b)
49  if (sum (c) /= 5775.0_T) STOP 4
50
51  deallocate (a, b, c)
52
53end program matmul_1
54