diff options
author | Mark Eggleston <mark.eggleston@codethink.com> | 2019-10-03 09:40:23 +0000 |
---|---|---|
committer | Mark Eggleston <markeggleston@gcc.gnu.org> | 2019-10-03 09:40:23 +0000 |
commit | f61e54e59cda5a2e281d525d3f87ffa179fae1ae (patch) | |
tree | 522705254b54086a43db1ff08a986353ea587ff9 /gcc/fortran/intrinsic.c | |
parent | 38a734350fd787da1b4bcf9b4e0a99ed2adb5eae (diff) | |
download | gcc-f61e54e59cda5a2e281d525d3f87ffa179fae1ae.zip gcc-f61e54e59cda5a2e281d525d3f87ffa179fae1ae.tar.gz gcc-f61e54e59cda5a2e281d525d3f87ffa179fae1ae.tar.bz2 |
Character typenames in errors and warnings
Character type names now incorporate length, kind is only shown if
the default character is not being used.
Examples:
character(7) is reported as CHARACTER(7)
character(len=20,kind=4) is reported as CHARACTER(20,4)
dummy character variables with assumed length:
character(*) is reported as CHARACTER(*)
character(*,kind=4) is reported as CHARACTER(*,4)
From-SVN: r276505
Diffstat (limited to 'gcc/fortran/intrinsic.c')
-rw-r--r-- | gcc/fortran/intrinsic.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index 764e350..ac5af10 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -4363,11 +4363,12 @@ check_arglist (gfc_actual_arglist **ap, gfc_intrinsic_sym *sym, if (!gfc_compare_types (&ts, &actual->expr->ts)) { if (error_flag) - gfc_error ("Type of argument %qs in call to %qs at %L should " - "be %s, not %s", gfc_current_intrinsic_arg[i]->name, - gfc_current_intrinsic, &actual->expr->where, - gfc_typename (&formal->ts), - gfc_typename (&actual->expr->ts)); + gfc_error ("In call to %qs at %L, type mismatch in argument " + "%qs; pass %qs to %qs", gfc_current_intrinsic, + &actual->expr->where, + gfc_current_intrinsic_arg[i]->name, + gfc_typename (actual->expr), + gfc_dummy_typename (&formal->ts)); return false; } @@ -5076,6 +5077,8 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) gfc_expr *new_expr; int rank; mpz_t *shape; + bool is_char_constant = (expr->expr_type == EXPR_CONSTANT) + && (expr->ts.type == BT_CHARACTER); from_ts = expr->ts; /* expr->ts gets clobbered */ @@ -5117,7 +5120,7 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) if ((gfc_option.warn_std & sym->standard) != 0) { gfc_warning_now (0, "Extension: Conversion from %s to %s at %L", - gfc_typename (&from_ts), gfc_typename (ts), + gfc_typename (&from_ts), gfc_dummy_typename (ts), &expr->where); } else if (wflag) @@ -5179,7 +5182,7 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) /* If HOLLERITH is involved, all bets are off. */ if (warn_conversion) gfc_warning_now (OPT_Wconversion, "Conversion from %s to %s at %L", - gfc_typename (&from_ts), gfc_typename (ts), + gfc_typename (&from_ts), gfc_dummy_typename (ts), &expr->where); } else @@ -5231,15 +5234,17 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag) return true; bad: + const char *type_name = is_char_constant ? gfc_typename (expr) + : gfc_typename (&from_ts); if (eflag == 1) { - gfc_error ("Cannot convert %s to %s at %L", - gfc_typename (&from_ts), gfc_typename (ts), &expr->where); + gfc_error ("Cannot convert %s to %s at %L", type_name, gfc_typename (ts), + &expr->where); return false; } - gfc_internal_error ("Cannot convert %qs to %qs at %L", - gfc_typename (&from_ts), gfc_typename (ts), + gfc_internal_error ("Cannot convert %qs to %qs at %L", type_name, + gfc_typename (ts), &expr->where); /* Not reached */ } |