aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/expr.c
diff options
context:
space:
mode:
authorDaniel Kraft <d@domob.eu>2008-12-18 11:05:54 +0100
committerDaniel Kraft <domob@gcc.gnu.org>2008-12-18 11:05:54 +0100
commitfb5bc08bb353a574a011eaf5b7ae874672e4b289 (patch)
treec4d520f172c9b4f97852d08d4e5fc12e76b2adde /gcc/fortran/expr.c
parentec81df7d4e83ddd28014e07e0eec7fe0e3559deb (diff)
downloadgcc-fb5bc08bb353a574a011eaf5b7ae874672e4b289.zip
gcc-fb5bc08bb353a574a011eaf5b7ae874672e4b289.tar.gz
gcc-fb5bc08bb353a574a011eaf5b7ae874672e4b289.tar.bz2
re PR fortran/31822 (Missing run-time bound checks for character pointer => target)
2008-12-18 Daniel Kraft <d@domob.eu> PR fortran/31822 * gfortran.h (gfc_check_same_strlen): Made public. * trans.h (gfc_trans_same_strlen_check): Made public. * check.c (gfc_check_same_strlen): Made public and adapted error message output to be useful not only for intrinsics. (gfc_check_merge): Adapt to gfc_check_same_strlen change. * expr.c (gfc_check_pointer_assign): Use gfc_check_same_strlen for string length compile-time check. * trans-expr.c (gfc_trans_pointer_assignment): Add runtime-check for equal string lengths using gfc_trans_same_strlen_check. * trans-intrinsic.c (gfc_trans_same_strlen_check): Renamed and made public from conv_same_strlen_check. (gfc_conv_intrinsic_merge): Adapted accordingly. 2008-12-18 Daniel Kraft <d@domob.eu> PR fortran/31822 * gfortran.dg/char_pointer_assign_2.f90: Updated expected error message to be more detailed. * gfortran.dg/char_pointer_assign_4.f90: New test. * gfortran.dg/char_pointer_assign_5.f90: New test. From-SVN: r142808
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r--gcc/fortran/expr.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 4bdee7c..8a992ca 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3179,15 +3179,11 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
if (rvalue->expr_type == EXPR_NULL)
return SUCCESS;
- if (lvalue->ts.type == BT_CHARACTER
- && lvalue->ts.cl && rvalue->ts.cl
- && lvalue->ts.cl->length && rvalue->ts.cl->length
- && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
- rvalue->ts.cl->length)) == 1)
+ if (lvalue->ts.type == BT_CHARACTER)
{
- gfc_error ("Different character lengths in pointer "
- "assignment at %L", &lvalue->where);
- return FAILURE;
+ gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
+ if (t == FAILURE)
+ return FAILURE;
}
if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))