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
This commit is contained in:
Daniel Franke 2008-12-12 08:22:55 -05:00 committed by Daniel Franke
parent b8153009d8
commit bf4f96e610
4 changed files with 55 additions and 2 deletions

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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