[patch, fortran] Fix PR 26039, lack of conformance checking in some intrinsics
Thomas Koenig
Thomas.Koenig@online.de
Tue Jan 31 22:31:00 GMT 2006
On Tue, Jan 31, 2006 at 06:48:30AM +0100, Paul Thomas wrote:
:ADDPATCH fortran:
> Why don't you
> use gfc_check_conformance (const char*, gfc_expr *, gfc_expr*), which
> will check the shapes as well? The standard does actually specify
> conformability.
Because I didn't know that this exists :-) Thanks for the hint.
What about this? OK for 4.2 and (after some days) for 4.1?
Thomas
2006-01-31 Thomas Koenig <Thomas.Koenig@online.de>
PR fortran/26039
expr.c (gfc_check_conformance): Reorder error message
to avoid plural.
check.c(gfc_check_minloc_maxloc): Call gfc_check_conformance
for checking arguments array and mask.
(check_reduction): Likewise.
2006-01-31 Thomas Koenig <Thomas.Koenig@online.de>
PR fortran/26039
maxval_maxloc_conformance_1.f90: New test.
-------------- next part --------------
Index: expr.c
===================================================================
--- expr.c (revision 110306)
+++ expr.c (working copy)
@@ -1821,7 +1821,7 @@ gfc_check_conformance (const char *optyp
if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
{
- gfc_error ("%s at %L has different shape on dimension %d (%d/%d)",
+ gfc_error ("different shape for %s at %L on dimension %d (%d/%d)",
_(optype_msgid), &op1->where, d + 1,
(int) mpz_get_si (op1_size),
(int) mpz_get_si (op2_size));
Index: check.c
===================================================================
--- check.c (revision 110306)
+++ check.c (working copy)
@@ -354,7 +354,6 @@ dim_rank_check (gfc_expr * dim, gfc_expr
return SUCCESS;
}
-
/***** Check functions *****/
/* Check subroutine suitable for intrinsics taking a real argument and
@@ -1526,6 +1525,16 @@ gfc_check_minloc_maxloc (gfc_actual_argl
if (m != NULL && type_check (m, 2, BT_LOGICAL) == FAILURE)
return FAILURE;
+ if (m != NULL)
+ {
+ char buffer[80];
+ snprintf(buffer, sizeof(buffer), "arguments '%s' and '%s' for intrinsic %s",
+ gfc_current_intrinsic_arg[0], gfc_current_intrinsic_arg[2],
+ gfc_current_intrinsic);
+ if (gfc_check_conformance (buffer, a, m) == FAILURE)
+ return FAILURE;
+ }
+
return SUCCESS;
}
@@ -1548,8 +1557,9 @@ gfc_check_minloc_maxloc (gfc_actual_argl
static try
check_reduction (gfc_actual_arglist * ap)
{
- gfc_expr *m, *d;
+ gfc_expr *a, *m, *d;
+ a = ap->expr;
d = ap->next->expr;
m = ap->next->next->expr;
@@ -1571,6 +1581,16 @@ check_reduction (gfc_actual_arglist * ap
if (m != NULL && type_check (m, 2, BT_LOGICAL) == FAILURE)
return FAILURE;
+ if (m != NULL)
+ {
+ char buffer[80];
+ snprintf(buffer, sizeof(buffer), "arguments '%s' and '%s' for intrinsic %s",
+ gfc_current_intrinsic_arg[0], gfc_current_intrinsic_arg[2],
+ gfc_current_intrinsic);
+ if (gfc_check_conformance (buffer, a, m) == FAILURE)
+ return FAILURE;
+ }
+
return SUCCESS;
}
-------------- next part --------------
! { dg-do compile }
! PR 26039: Tests for different ranks for (min|max)loc, (min|max)val, product
! and sum were missing.
program main
integer, dimension(2) :: a
logical, dimension(2,1) :: lo
logical, dimension(3) :: lo2
a = (/ 1, 2 /)
lo = .true.
print *,minloc(a,mask=lo) ! { dg-error "Incompatible ranks" }
print *,maxloc(a,mask=lo) ! { dg-error "Incompatible ranks" }
print *,minval(a,mask=lo) ! { dg-error "Incompatible ranks" }
print *,maxval(a,mask=lo) ! { dg-error "Incompatible ranks" }
print *,sum(a,mask=lo) ! { dg-error "Incompatible ranks" }
print *,product(a,mask=lo) ! { dg-error "Incompatible ranks" }
print *,minloc(a,1,mask=lo) ! { dg-error "Incompatible ranks" }
print *,maxloc(a,1,mask=lo) ! { dg-error "Incompatible ranks" }
print *,minval(a,1,mask=lo) ! { dg-error "Incompatible ranks" }
print *,maxval(a,1,mask=lo) ! { dg-error "Incompatible ranks" }
print *,sum(a,1,mask=lo) ! { dg-error "Incompatible ranks" }
print *,product(a,1,mask=lo) ! { dg-error "Incompatible ranks" }
print *,minloc(a,mask=lo2) ! { dg-error "different shape" }
print *,maxloc(a,mask=lo2) ! { dg-error "different shape" }
print *,minval(a,mask=lo2) ! { dg-error "different shape" }
print *,maxval(a,mask=lo2) ! { dg-error "different shape" }
print *,sum(a,mask=lo2) ! { dg-error "different shape" }
print *,product(a,mask=lo2) ! { dg-error "different shape" }
print *,minloc(a,1,mask=lo2) ! { dg-error "different shape" }
print *,maxloc(a,1,mask=lo2) ! { dg-error "different shape" }
print *,minval(a,1,mask=lo2) ! { dg-error "different shape" }
print *,maxval(a,1,mask=lo2) ! { dg-error "different shape" }
print *,sum(a,1,mask=lo2) ! { dg-error "different shape" }
print *,product(a,1,mask=lo2) ! { dg-error "different shape" }
end program main
More information about the Gcc-patches
mailing list