Hi, the attached patch fixes a 7/8/9 regression where a conversion warning was emitted for DIM. The problem was that the no-warn flag had not been passed down to the arithmetic conversion routines, which is solved here by adding and using a flag in gfc_expr.
Regression-tested. OK for affected branches? Regards Thomas 2019-02-02 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/88298 * arith.c (gfc_int2int): Do not warn if src->do_not_warn is set. * gfortran.h (gfc_expr): Add flag do_not_warn. * intrinsic.c (gfc_convert_type_warn): Set expr->do_not_warn if no warning is desired. 2019-02-02 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/88298 * gfortran.dg/warn_conversion_10.f90: New test.
Index: arith.c =================================================================== --- arith.c (Revision 268432) +++ arith.c (Arbeitskopie) @@ -2061,7 +2061,7 @@ gfc_int2int (gfc_expr *src, int kind) gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size); - if (warn_conversion && kind < src->ts.kind) + if (warn_conversion && !src->do_not_warn && kind < src->ts.kind) gfc_warning_now (OPT_Wconversion, "Conversion from %qs to %qs at %L", gfc_typename (&src->ts), gfc_typename (&result->ts), &src->where); Index: gfortran.h =================================================================== --- gfortran.h (Revision 268432) +++ gfortran.h (Arbeitskopie) @@ -2168,6 +2168,9 @@ typedef struct gfc_expr unsigned int do_not_resolve_again : 1; + /* Set this if no warning should be given somewhere in a lower level. */ + + unsigned int do_not_warn : 1; /* If an expression comes from a Hollerith constant or compile-time evaluation of a transfer statement, it may have a prescribed target- memory representation, and these cannot always be backformed from Index: intrinsic.c =================================================================== --- intrinsic.c (Revision 268432) +++ intrinsic.c (Arbeitskopie) @@ -5028,6 +5028,8 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespe if (ts->type == BT_UNKNOWN) goto bad; + expr->do_not_warn = ! wflag; + /* NULL and zero size arrays get their type here, unless they already have a typespec. */ if ((expr->expr_type == EXPR_NULL
! { dg-do compile } ! { dg-options "-fno-range-check -Wconversion" } ! PR 88298 - this used to warn unnecessarily. Original test case by ! Harald Anlauf. subroutine bug (j, js) integer :: j, js(3,2) js(:,:) = cshift (js(:,:), shift=j, dim=1) end subroutine bug