]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/36341 (MATMUL: Bounds check missing)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 7 Jul 2008 19:43:33 +0000 (19:43 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 7 Jul 2008 19:43:33 +0000 (19:43 +0000)
2008-07-07  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/36341
PR fortran/34670
* m4/matmul.m4:  Add bounds checking.
* m4/matmull.m4:  Likewise.
* generated/matmul_c10.c: Regenerated.
* generated/matmul_c16.c: Regenerated.
* generated/matmul_c4.c: Regenerated.
* generated/matmul_c8.c: Regenerated.
* generated/matmul_i1.c: Regenerated.
* generated/matmul_i16.c: Regenerated.
* generated/matmul_i2.c: Regenerated.
* generated/matmul_i4.c: Regenerated.
* generated/matmul_i8.c: Regenerated.
* generated/matmul_l16.c: Regenerated.
* generated/matmul_l4.c: Regenerated.
* generated/matmul_l8.c: Regenerated.
* generated/matmul_r10.c: Regenerated.
* generated/matmul_r16.c: Regenerated.
* generated/matmul_r4.c: Regenerated.
* generated/matmul_r8.c: Regenerated.

2008-07-07  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/36341
PR fortran/34670
* gfortran.dg/matmul_bounds_2.f90:  New test.
* gfortran.dg/matmul_bounds_3.f90:  New test.
* gfortran.dg/matmul_bounds_4.f90:  New test.
* gfortran.dg/matmul_bounds_5.f90:  New test.

From-SVN: r137594

24 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/matmul_bounds_2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/matmul_bounds_3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/matmul_bounds_4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/matmul_bounds_5.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/generated/matmul_c10.c
libgfortran/generated/matmul_c16.c
libgfortran/generated/matmul_c4.c
libgfortran/generated/matmul_c8.c
libgfortran/generated/matmul_i1.c
libgfortran/generated/matmul_i16.c
libgfortran/generated/matmul_i2.c
libgfortran/generated/matmul_i4.c
libgfortran/generated/matmul_i8.c
libgfortran/generated/matmul_l16.c
libgfortran/generated/matmul_l4.c
libgfortran/generated/matmul_l8.c
libgfortran/generated/matmul_r10.c
libgfortran/generated/matmul_r16.c
libgfortran/generated/matmul_r4.c
libgfortran/generated/matmul_r8.c
libgfortran/m4/matmul.m4
libgfortran/m4/matmull.m4

index b212e44c398150b5f986a7fbd11c24a8a31c0105..143f75db13d4319592f62633ad1fc46ae0e3c869 100644 (file)
@@ -1,3 +1,12 @@
+2008-07-07  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/36341
+       PR fortran/34670
+       * gfortran.dg/matmul_bounds_2.f90:  New test.
+       * gfortran.dg/matmul_bounds_3.f90:  New test.
+       * gfortran.dg/matmul_bounds_4.f90:  New test.
+       * gfortran.dg/matmul_bounds_5.f90:  New test.
+
 2008-07-07  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/torture/pta-ptrarith-1.c: New testcase.
diff --git a/gcc/testsuite/gfortran.dg/matmul_bounds_2.f90 b/gcc/testsuite/gfortran.dg/matmul_bounds_2.f90
new file mode 100644 (file)
index 0000000..429b28c
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do run }
+! { dg-options "-fbounds-check" }
+! { dg-shouldfail "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic for dimension 2: is 2, should be 3" }
+program main
+  real, dimension(3,2) :: a
+  real, dimension(2,3) :: b
+  real, dimension(:,:), allocatable :: ret
+  allocate (ret(2,2))
+  a = 1.0
+  b = 2.3
+  ret = matmul(b,a)  ! This is OK
+  deallocate(ret)
+  allocate(ret(3,2))
+  ret = matmul(a,b)  ! This should throw an error.
+end program main
+! { dg-output "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic for dimension 2: is 2, should be 3" }
diff --git a/gcc/testsuite/gfortran.dg/matmul_bounds_3.f90 b/gcc/testsuite/gfortran.dg/matmul_bounds_3.f90
new file mode 100644 (file)
index 0000000..c5830de
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do run }
+! { dg-options "-fbounds-check" }
+! { dg-shouldfail "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic for dimension 1: is 2, should be 3" }
+program main
+  real, dimension(3,2) :: a
+  real, dimension(2,3) :: b
+  real, dimension(:,:), allocatable :: ret
+  allocate (ret(3,3))
+  a = 1.0
+  b = 2.3
+  ret = matmul(a,b)  ! This is OK
+  deallocate(ret)
+  allocate(ret(2,3))
+  ret = matmul(a,b)  ! This should throw an error.
+end program main
+! { dg-output "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic for dimension 1: is 2, should be 3" }
diff --git a/gcc/testsuite/gfortran.dg/matmul_bounds_4.f90 b/gcc/testsuite/gfortran.dg/matmul_bounds_4.f90
new file mode 100644 (file)
index 0000000..a61bacc
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do run }
+! { dg-options "-fbounds-check" }
+! { dg-shouldfail "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic: is 3, should be 2" }
+program main
+  real, dimension(3) :: a
+  real, dimension(3,2) :: b
+  real, dimension(:), allocatable :: ret
+  allocate (ret(2))
+  a = 1.0
+  b = 2.3
+  ret = matmul(a,b)  ! This is OK
+  deallocate(ret)
+  allocate(ret(3))
+  ret = matmul(a,b)  ! This should throw an error.
+end program main
+! { dg-output "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic: is 3, should be 2" }
diff --git a/gcc/testsuite/gfortran.dg/matmul_bounds_5.f90 b/gcc/testsuite/gfortran.dg/matmul_bounds_5.f90
new file mode 100644 (file)
index 0000000..4b20098
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do run }
+! { dg-options "-fbounds-check" }
+! { dg-shouldfail "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic: is 3, should be 2" }
+program main
+  real, dimension(2,3) :: a
+  real, dimension(3) :: b
+  real, dimension(:), allocatable :: ret
+  allocate (ret(2))
+  a = 1.0
+  b = 2.3
+  ret = matmul(a,b)  ! This is OK
+  deallocate(ret)
+  allocate(ret(3))
+  ret = matmul(a,b)  ! This should throw an error.
+end program main
+! { dg-output "Fortran runtime error: Incorrect extent in return array in MATMUL intrinsic: is 3, should be 2" }
index 18bd7b1189a2a746bce366470cdae0150e20f8aa..c845606c80311c8186bec235aa88730cf99b65ac 100644 (file)
@@ -1,3 +1,26 @@
+2008-07-07  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/36341
+       PR fortran/34670
+       * m4/matmul.m4:  Add bounds checking.
+       * m4/matmull.m4:  Likewise.
+       * generated/matmul_c10.c: Regenerated.
+       * generated/matmul_c16.c: Regenerated.
+       * generated/matmul_c4.c: Regenerated.
+       * generated/matmul_c8.c: Regenerated.
+       * generated/matmul_i1.c: Regenerated.
+       * generated/matmul_i16.c: Regenerated.
+       * generated/matmul_i2.c: Regenerated.
+       * generated/matmul_i4.c: Regenerated.
+       * generated/matmul_i8.c: Regenerated.
+       * generated/matmul_l16.c: Regenerated.
+       * generated/matmul_l4.c: Regenerated.
+       * generated/matmul_l8.c: Regenerated.
+       * generated/matmul_r10.c: Regenerated.
+       * generated/matmul_r16.c: Regenerated.
+       * generated/matmul_r4.c: Regenerated.
+       * generated/matmul_r8.c: Regenerated.
+
 2008-07-07  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * acinclude.m4 (LIBGFOR_CHECK_GTHR_DEFAULT): Fix configure cache
index 08c2044dd8b98602fb079518b4a805d7ee50c298..0e378626f9603de3f243dcf17f9c31cc0a05538a 100644 (file)
@@ -135,6 +135,47 @@ matmul_c10 (gfc_array_c10 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_COMPLEX_10) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 6a2a63909678c1ea66f9175029ded72f24f84b78..34cc51dbd78b509776f745d78e835baa137e5f03 100644 (file)
@@ -135,6 +135,47 @@ matmul_c16 (gfc_array_c16 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_COMPLEX_16) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 6dcf6fea56a9fdcf49c9b7545556be5effbb56af..fdfea1df9554bc1d29f8c53871e1ff192b9be666 100644 (file)
@@ -135,6 +135,47 @@ matmul_c4 (gfc_array_c4 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_COMPLEX_4) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 8bc619d879f68c240adb42cff3a74b9a681dd671..9d6694922f109f3732ea675677a8de9566a67aa9 100644 (file)
@@ -135,6 +135,47 @@ matmul_c8 (gfc_array_c8 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_COMPLEX_8) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index ca16ed40b2f4dc79fadedaf4eac7cdbc806f3dce..34fd7c51b78bfe9354c4c83cc66c38a53a170823 100644 (file)
@@ -135,6 +135,47 @@ matmul_i1 (gfc_array_i1 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_INTEGER_1) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 33c62ae41529c86fa3d766e3816ab00e5e2cd729..0c7c5d8f39662f1d06237f818f808cc8bcf01b2f 100644 (file)
@@ -135,6 +135,47 @@ matmul_i16 (gfc_array_i16 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_INTEGER_16) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index e3119acbd41fb1ac394defd6fb8adff30bd1cd6b..5d55847edcea00d9cce57008b8053786e2d48149 100644 (file)
@@ -135,6 +135,47 @@ matmul_i2 (gfc_array_i2 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_INTEGER_2) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index a1b8c50f051173c6ef321f5cacc61f541294822f..a80f14940c81cd0df0a2780f778038e7623df563 100644 (file)
@@ -135,6 +135,47 @@ matmul_i4 (gfc_array_i4 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_INTEGER_4) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index eee73ac88f031ada9285228377f85d88e541b2e8..91499c793e6b4edf65809bf4a787e7c689f8b98d 100644 (file)
@@ -135,6 +135,47 @@ matmul_i8 (gfc_array_i8 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_INTEGER_8) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index b2b86ecfed176309e16aacf29f7685ea90b1462a..b604edfb2ca98309d6110ade53857f8308c112b5 100644 (file)
@@ -99,6 +99,47 @@ matmul_l16 (gfc_array_l16 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_LOGICAL_16) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
   abase = a->data;
   a_kind = GFC_DESCRIPTOR_SIZE (a);
index 9a6cb1d357ddf5dd11fe3bec367ccae7247781ea..5aed0fe2ba077a1c8d51fda066072a4d13d5ecbc 100644 (file)
@@ -99,6 +99,47 @@ matmul_l4 (gfc_array_l4 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_LOGICAL_4) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
   abase = a->data;
   a_kind = GFC_DESCRIPTOR_SIZE (a);
index 7d4e35e82e3287df68d3176be25cb93e217fadab..26baad3213660fa6c490e6cdb7ae6b715a061444 100644 (file)
@@ -99,6 +99,47 @@ matmul_l8 (gfc_array_l8 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_LOGICAL_8) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
   abase = a->data;
   a_kind = GFC_DESCRIPTOR_SIZE (a);
index 58dfe75814f45fbed100cd054b4b0dea01a633d1..931e2bdc0f025b28b841c6bd750b8ad5f0f4abb5 100644 (file)
@@ -135,6 +135,47 @@ matmul_r10 (gfc_array_r10 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_REAL_10) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index a6a93be91fb5dfa16f31274c0308c8ba84370ea3..16ec175be0cf6e5f704fa6bc2f67e16339b0c5ea 100644 (file)
@@ -135,6 +135,47 @@ matmul_r16 (gfc_array_r16 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_REAL_16) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 1154d41a33f2148c599cbf240b8c23dbd0521b13..47d976415d0b6fc1be7a250cf0037278d20a2757 100644 (file)
@@ -135,6 +135,47 @@ matmul_r4 (gfc_array_r4 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_REAL_4) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 7bce2533b418cd720b2a500daf0a4e53d909d24c..a359ffd8fd3d51d7c98119adeab040579bf8b37a 100644 (file)
@@ -135,6 +135,47 @@ matmul_r8 (gfc_array_r8 * const restrict retarray,
        = internal_malloc_size (sizeof (GFC_REAL_8) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
 
   if (GFC_DESCRIPTOR_RANK (retarray) == 1)
index 181efa3b654b85c3c03b0581520549dd587881d1..a43b430c2e3036468a661a130b835af27c0f87ac 100644 (file)
@@ -136,6 +136,47 @@ matmul_'rtype_code` ('rtype` * const restrict retarray,
        = internal_malloc_size (sizeof ('rtype_name`) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 '
 sinclude(`matmul_asm_'rtype_code`.m4')dnl
 `
index 54afa8a238eb44b44d26ec532cc15b5a95fadd38..800444564f7244af438e119ef0e43c07e0a7eddb 100644 (file)
@@ -100,6 +100,47 @@ matmul_'rtype_code` ('rtype` * const restrict retarray,
        = internal_malloc_size (sizeof ('rtype_name`) * size0 ((array_t *) retarray));
       retarray->offset = 0;
     }
+    else if (compile_options.bounds_check)
+      {
+       index_type ret_extent, arg_extent;
+
+       if (GFC_DESCRIPTOR_RANK (a) == 1)
+         {
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+       else if (GFC_DESCRIPTOR_RANK (b) == 1)
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic: is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);         
+         }
+       else
+         {
+           arg_extent = a->dim[0].ubound + 1 - a->dim[0].lbound;
+           ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 1:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+
+           arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
+           ret_extent = retarray->dim[1].ubound + 1 - retarray->dim[1].lbound;
+           if (arg_extent != ret_extent)
+             runtime_error ("Incorrect extent in return array in"
+                            " MATMUL intrinsic for dimension 2:"
+                            " is %ld, should be %ld",
+                            (long int) ret_extent, (long int) arg_extent);
+         }
+      }
 
   abase = a->data;
   a_kind = GFC_DESCRIPTOR_SIZE (a);