This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PR fortran/71859] Patch
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Fri, 22 Jul 2016 14:30:58 -0700
- Subject: [PR fortran/71859] Patch
- Authentication-results: sourceware.org; auth=none
I intend to commit the following patch in approximately
2 * exp(1.) = 5.436 hours.
2016-07-22 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/71859
* check.c(numeric_check): Prevent ICE. Issue error for invalid
subroutine as an actual argument when numeric argument is expected.
2016-07-22 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/71859
* gfortran.dg/pr71859.f90: New test.
* gfortran.dg/intrinsic_numeric_arg.f: Update error message.
* gfortran.dg/coarray_collectives_1.f90: Ditto.
Index: gcc/fortran/check.c
===================================================================
--- gcc/fortran/check.c (revision 238665)
+++ gcc/fortran/check.c (working copy)
@@ -72,6 +72,11 @@ type_check (gfc_expr *e, int n, bt type)
static bool
numeric_check (gfc_expr *e, int n)
{
+ /* Users sometime use a subroutine designator as an actual argument to
+ an intrinsic subprogram that expects an argument with a numeric type. */
+ if (e->symtree && e->symtree->n.sym->attr.subroutine)
+ goto bandaid;
+
if (gfc_numeric_ts (&e->ts))
return true;
@@ -86,7 +91,9 @@ numeric_check (gfc_expr *e, int n)
return true;
}
- gfc_error ("%qs argument of %qs intrinsic at %L must be a numeric type",
+bandaid:
+
+ gfc_error ("%qs argument of %qs intrinsic at %L must have a numeric type",
gfc_current_intrinsic_arg[n]->name, gfc_current_intrinsic,
&e->where);
Index: gcc/testsuite/gfortran.dg/pr71859.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr71859.f90 (nonexistent)
+++ gcc/testsuite/gfortran.dg/pr71859.f90 (working copy)
@@ -0,0 +1,8 @@
+! { dg-do compile }
+program p
+ call s(1)
+ x = abs(s) ! { dg-error "must have a numeric type" }
+end
+subroutine s(n)
+ print *, n
+end
Index: gcc/testsuite/gfortran.dg/intrinsic_numeric_arg.f
===================================================================
--- gcc/testsuite/gfortran.dg/intrinsic_numeric_arg.f (revision 238665)
+++ gcc/testsuite/gfortran.dg/intrinsic_numeric_arg.f (working copy)
@@ -4,6 +4,6 @@
LOGICAL Z
CHARACTER A
REAL R
- R = ABS(Z) ! { dg-error " must be a numeric type" }
- R = ABS(A) ! { dg-error " must be a numeric type" }
+ R = ABS(Z) ! { dg-error " must have a numeric type" }
+ R = ABS(A) ! { dg-error " must have a numeric type" }
END
Index: gcc/testsuite/gfortran.dg/coarray_collectives_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/coarray_collectives_1.f90 (revision 238665)
+++ gcc/testsuite/gfortran.dg/coarray_collectives_1.f90 (working copy)
@@ -14,7 +14,7 @@ program test
integer(8) :: i8
character(len=19, kind=4) :: msg4
- call co_sum("abc") ! { dg-error "must be a numeric type" }
+ call co_sum("abc") ! { dg-error "must have a numeric type" }
call co_max(cmplx(1.0,0.0)) ! { dg-error "shall be of type integer, real or character" }
call co_min(cmplx(0.0,1.0)) ! { dg-error "shall be of type integer, real or character" }
--
Steve