The attached patch has been committed to trunk after regression testing. Two loci are available for the error messages. If the first locus is NULL, then it uses the second one to report the error.
In the audit trail of the PR manu@ suggested removing the assert() that caused the ICE. His patch tested for a NULL locus, and simply reported UNKNOWN LOCATION in the error message. I find the ICE to be an aid in locating where gfortran goes sideways, so I've left the assert() in place. Index: gcc/fortran/expr.c =================================================================== --- gcc/fortran/expr.c (revision 261376) +++ gcc/fortran/expr.c (working copy) @@ -3414,6 +3414,8 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, /* Only DATA Statements come here. */ if (!conform) { + locus *where; + /* Numeric can be converted to any other numeric. And Hollerith can be converted to any other type. */ if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts)) @@ -3423,8 +3425,9 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL) return true; + where = lvalue->where.lb ? &lvalue->where : &rvalue->where; gfc_error ("Incompatible types in DATA statement at %L; attempted " - "conversion of %s to %s", &lvalue->where, + "conversion of %s to %s", where, gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts)); return false; Index: gcc/testsuite/gfortran.dg/pr44491.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr44491.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/pr44491.f90 (working copy) @@ -0,0 +1,4 @@ +! { dg-do compile } +! PR fortran/44491 + character*2 escape /z'1B'/ { dg-error "Incompatible types in DATA" } + end -- Steve
Index: gcc/fortran/expr.c =================================================================== --- gcc/fortran/expr.c (revision 261376) +++ gcc/fortran/expr.c (working copy) @@ -3414,6 +3414,8 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, /* Only DATA Statements come here. */ if (!conform) { + locus *where; + /* Numeric can be converted to any other numeric. And Hollerith can be converted to any other type. */ if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts)) @@ -3423,8 +3425,9 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL) return true; + where = lvalue->where.lb ? &lvalue->where : &rvalue->where; gfc_error ("Incompatible types in DATA statement at %L; attempted " - "conversion of %s to %s", &lvalue->where, + "conversion of %s to %s", where, gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts)); return false; Index: gcc/testsuite/gfortran.dg/pr44491.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr44491.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/pr44491.f90 (working copy) @@ -0,0 +1,4 @@ +! { dg-do compile } +! PR fortran/44491 + character*2 escape /z'1B'/ ! { dg-error "Incompatible types in DATA" } + end