aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Franke <franke.daniel@gmail.com>2008-12-12 08:22:55 -0500
committerDaniel Franke <dfranke@gcc.gnu.org>2008-12-12 08:22:55 -0500
commitbf4f96e610c0cf7928b41e8ad160fafb05f04331 (patch)
tree6233022947a448d11526ea2c684fa00b7374445f
parentb8153009d83b45c491f2b2cca75d4d1ea6eb3af8 (diff)
downloadgcc-bf4f96e610c0cf7928b41e8ad160fafb05f04331.zip
gcc-bf4f96e610c0cf7928b41e8ad160fafb05f04331.tar.gz
gcc-bf4f96e610c0cf7928b41e8ad160fafb05f04331.tar.bz2
re PR fortran/36355 (matmul argument-check: wrong error messages)
gcc/fortran: 2008-12-12 Daniel Franke <franke.daniel@gmail.com> PR fortran/36355 * check.c (gfc_check_matmul): Fixed error message for invalid types to correctly identify the offending argument, added check for mismatching types. gcc/testsuite: 2008-12-12 Daniel Franke <franke.daniel@gmail.com> PR fortran/36355 * gfortran.dg/matmul_argument_types.f90: New. From-SVN: r142709
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/check.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/matmul_argument_types.f9032
4 files changed, 55 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7fa2cf4..db1fe42 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-12 Daniel Franke <franke.daniel@gmail.com>
+
+ PR fortran/36355
+ * check.c (gfc_check_matmul): Fixed error message for invalid
+ types to correctly identify the offending argument, added check
+ for mismatching types.
+
2008-12-11 Richard Guenther <rguenther@suse.de>
* Make-lang.in (install-finclude-dir): Use correct mode argument
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index de50767..8ca67f2 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -1794,7 +1794,7 @@ gfc_check_malloc (gfc_expr *size)
gfc_try
gfc_check_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
{
- if ((matrix_a->ts.type != BT_LOGICAL) && !gfc_numeric_ts (&matrix_b->ts))
+ if ((matrix_a->ts.type != BT_LOGICAL) && !gfc_numeric_ts (&matrix_a->ts))
{
gfc_error ("'%s' argument of '%s' intrinsic at %L must be numeric "
"or LOGICAL", gfc_current_intrinsic_arg[0],
@@ -1802,7 +1802,7 @@ gfc_check_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
return FAILURE;
}
- if ((matrix_b->ts.type != BT_LOGICAL) && !gfc_numeric_ts (&matrix_a->ts))
+ if ((matrix_b->ts.type != BT_LOGICAL) && !gfc_numeric_ts (&matrix_b->ts))
{
gfc_error ("'%s' argument of '%s' intrinsic at %L must be numeric "
"or LOGICAL", gfc_current_intrinsic_arg[1],
@@ -1810,6 +1810,15 @@ gfc_check_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
return FAILURE;
}
+ if ((matrix_a->ts.type == BT_LOGICAL && gfc_numeric_ts (&matrix_b->ts))
+ || (gfc_numeric_ts (&matrix_a->ts) && matrix_b->ts.type == BT_LOGICAL))
+ {
+ gfc_error ("Argument types of '%s' intrinsic at %L must match (%s/%s)",
+ gfc_current_intrinsic, &matrix_a->where,
+ gfc_typename(&matrix_a->ts), gfc_typename(&matrix_b->ts));
+ return FAILURE;
+ }
+
switch (matrix_a->rank)
{
case 1:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0a8d28d..a3c9d7c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-12-12 Daniel Franke <franke.daniel@gmail.com>
+
+ PR fortran/36355
+ * gfortran.dg/matmul_argument_types.f90: New.
+
2008-12-11 Janis Johnson <janis187@us.ibm.com>
PR testsuite/29071
diff --git a/gcc/testsuite/gfortran.dg/matmul_argument_types.f90 b/gcc/testsuite/gfortran.dg/matmul_argument_types.f90
new file mode 100644
index 0000000..1480655
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/matmul_argument_types.f90
@@ -0,0 +1,32 @@
+! { dg-do compile }
+!
+! PR fortran/36355
+! Check MATMUL argument types:
+!
+! numeric logical other
+! numeric 1 2 3
+! logical 2 1 3
+! other 3 3 3
+!
+! where
+! 1 ok
+! 2 argument type mismatch
+! 3 invalid argument types
+!
+
+ INTEGER :: a(2,2)
+ LOGICAL :: b(2,2)
+ CHARACTER :: c
+
+ a = MATMUL(a, a) ! ok
+ a = MATMUL(a, b) ! { dg-error "must match" }
+ a = MATMUL(a, c) ! { dg-error "must be numeric or LOGICAL" }
+
+ b = MATMUL(b, a) ! { dg-error "must match" }
+ b = MATMUL(b, b) ! ok
+ b = MATMUL(b, c) ! { dg-error "must be numeric or LOGICAL" }
+
+ c = MATMUL(c, a) ! { dg-error "must be numeric or LOGICAL" }
+ c = MATMUL(c, b) ! { dg-error "must be numeric or LOGICAL" }
+ c = MATMUL(c, c) ! { dg-error "must be numeric or LOGICAL" }
+END