expr.c (gfc_copy_expr): Don't copy 'op1' and 'op2' for EXPR_SUBSTRING.
fortran/ * expr.c (gfc_copy_expr): Don't copy 'op1' and 'op2' for EXPR_SUBSTRING. (gfc_is_constant_expr): Check 'ref' to determine if substring reference is constant. (gfc_simplify_expr): Simplify 'ref' instead of 'op1' and 'op2'. (check_init_expr, check_restricted): Check 'ref' instead of 'op1' and 'op2'. * module.c (mio_expr): Read / write 'ref' instead of 'op1' and 'op2'. testsuite/ * gfortran.dg/substr_1.f90: New test. From-SVN: r94735
This commit is contained in:
parent
81122c446d
commit
eac33acc64
@ -1,3 +1,14 @@
|
||||
2005-02-08 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* expr.c (gfc_copy_expr): Don't copy 'op1' and 'op2' for
|
||||
EXPR_SUBSTRING.
|
||||
(gfc_is_constant_expr): Check 'ref' to determine if substring
|
||||
reference is constant.
|
||||
(gfc_simplify_expr): Simplify 'ref' instead of 'op1' and 'op2'.
|
||||
(check_init_expr, check_restricted): Check 'ref' instead of 'op1'
|
||||
and 'op2'.
|
||||
* module.c (mio_expr): Read / write 'ref' instead of 'op1' and 'op2'.
|
||||
|
||||
2005-02-07 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* gfortran.h (gfc_add_dimension, gfc_add_result, gfc_add_save,
|
||||
|
@ -393,9 +393,6 @@ gfc_copy_expr (gfc_expr * p)
|
||||
q->value.character.string = s;
|
||||
|
||||
memcpy (s, p->value.character.string, p->value.character.length + 1);
|
||||
|
||||
q->op1 = gfc_copy_expr (p->op1);
|
||||
q->op2 = gfc_copy_expr (p->op2);
|
||||
break;
|
||||
|
||||
case EXPR_CONSTANT:
|
||||
@ -699,7 +696,8 @@ gfc_is_constant_expr (gfc_expr * e)
|
||||
break;
|
||||
|
||||
case EXPR_SUBSTRING:
|
||||
rv = gfc_is_constant_expr (e->op1) && gfc_is_constant_expr (e->op2);
|
||||
rv = (gfc_is_constant_expr (e->ref->u.ss.start)
|
||||
&& gfc_is_constant_expr (e->ref->u.ss.end));
|
||||
break;
|
||||
|
||||
case EXPR_STRUCTURE:
|
||||
@ -1115,12 +1113,10 @@ gfc_simplify_expr (gfc_expr * p, int type)
|
||||
break;
|
||||
|
||||
case EXPR_SUBSTRING:
|
||||
if (gfc_simplify_expr (p->op1, type) == FAILURE
|
||||
|| gfc_simplify_expr (p->op2, type) == FAILURE)
|
||||
if (simplify_ref_chain (p->ref, type) == FAILURE)
|
||||
return FAILURE;
|
||||
|
||||
/* TODO: evaluate constant substrings. */
|
||||
|
||||
break;
|
||||
|
||||
case EXPR_OP:
|
||||
@ -1439,11 +1435,11 @@ check_init_expr (gfc_expr * e)
|
||||
break;
|
||||
|
||||
case EXPR_SUBSTRING:
|
||||
t = check_init_expr (e->op1);
|
||||
t = check_init_expr (e->ref->u.ss.start);
|
||||
if (t == FAILURE)
|
||||
break;
|
||||
|
||||
t = check_init_expr (e->op2);
|
||||
t = check_init_expr (e->ref->u.ss.end);
|
||||
if (t == SUCCESS)
|
||||
t = gfc_simplify_expr (e, 0);
|
||||
|
||||
@ -1662,11 +1658,11 @@ check_restricted (gfc_expr * e)
|
||||
break;
|
||||
|
||||
case EXPR_SUBSTRING:
|
||||
t = gfc_specification_expr (e->op1);
|
||||
t = gfc_specification_expr (e->ref->u.ss.start);
|
||||
if (t == FAILURE)
|
||||
break;
|
||||
|
||||
t = gfc_specification_expr (e->op2);
|
||||
t = gfc_specification_expr (e->ref->u.ss.end);
|
||||
if (t == SUCCESS)
|
||||
t = gfc_simplify_expr (e, 0);
|
||||
|
||||
|
@ -2483,8 +2483,7 @@ mio_expr (gfc_expr ** ep)
|
||||
case EXPR_SUBSTRING:
|
||||
e->value.character.string = (char *)
|
||||
mio_allocated_string (e->value.character.string);
|
||||
mio_expr (&e->op1);
|
||||
mio_expr (&e->op2);
|
||||
mio_ref_list (&e->ref);
|
||||
break;
|
||||
|
||||
case EXPR_STRUCTURE:
|
||||
|
@ -1,3 +1,7 @@
|
||||
2005-02-08 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* gfortran.dg/substr_1.f90: New test.
|
||||
|
||||
2005-02-07 Richard Guenther <rguenth@gcc.gnu.org>
|
||||
|
||||
PR middle-end/19775
|
||||
|
13
gcc/testsuite/gfortran.dg/substr_1.f90
Normal file
13
gcc/testsuite/gfortran.dg/substr_1.f90
Normal file
@ -0,0 +1,13 @@
|
||||
! { dg-do compile }
|
||||
! we used to save the wrong components of a gfc_expr describing a
|
||||
! substring of a constant string. This yielded a segfault on
|
||||
! translating the expressions read from the module.
|
||||
module m
|
||||
character (*), parameter :: a = "AABBCC"(1:4)
|
||||
end module m
|
||||
|
||||
use m
|
||||
character(4) :: b
|
||||
b = a
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user