aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/intrinsic.c
diff options
context:
space:
mode:
authorMark Eggleston <mark.eggleston@codethink.com>2019-12-19 15:13:25 +0000
committerMark Eggleston <markeggleston@gcc.gnu.org>2019-12-19 15:13:25 +0000
commit8405874a0e2db1806332ead2dcf3e9ec563075aa (patch)
tree90a26d11226d612f5fda08c8d2c36feb304072ce /gcc/fortran/intrinsic.c
parentaa0e90e7bff935856212b64236cd540acccc66a0 (diff)
downloadgcc-8405874a0e2db1806332ead2dcf3e9ec563075aa.zip
gcc-8405874a0e2db1806332ead2dcf3e9ec563075aa.tar.gz
gcc-8405874a0e2db1806332ead2dcf3e9ec563075aa.tar.bz2
Prevent conversion of character data in array constructors.
Fix for PR fortran/92896 [10 Regression] [DEC] ICE in reduce_unary, at fortran/arith.c:1283. This was caused by an unintended side affect of "Allow CHARACTER literals in assignments and data statements" (revision 277975). If the conversion occurs in a array constructor it is rejected. From-SVN: r279583
Diffstat (limited to 'gcc/fortran/intrinsic.c')
-rw-r--r--gcc/fortran/intrinsic.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 76b53bb..c913f5a 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -5096,10 +5096,15 @@ gfc_convert_type (gfc_expr *expr, gfc_typespec *ts, int eflag)
1 Generate a gfc_error()
2 Generate a gfc_internal_error().
- 'wflag' controls the warning related to conversion. */
+ 'wflag' controls the warning related to conversion.
+
+ 'array' indicates whether the conversion is in an array constructor.
+ Non-standard conversion from character to numeric not allowed if true.
+*/
bool
-gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
+gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag,
+ bool array)
{
gfc_intrinsic_sym *sym;
gfc_typespec from_ts;
@@ -5142,6 +5147,12 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
&& gfc_compare_types (&expr->ts, ts))
return true;
+ /* If array is true then conversion is in an array constructor where
+ non-standard conversion is not allowed. */
+ if (array && from_ts.type == BT_CHARACTER
+ && (gfc_numeric_ts (ts) || ts->type == BT_LOGICAL))
+ goto bad;
+
sym = find_conv (&expr->ts, ts);
if (sym == NULL)
goto bad;