diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 25bc317881e..b1918a3445a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2005-02-08 Tobias Schl"uter + + * 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 * gfortran.h (gfc_add_dimension, gfc_add_result, gfc_add_save, diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 87ce3e5fcbc..3898f7afd63 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -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); diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 3670a3a49ad..12d52c419a9 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -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: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4e93d07fdd0..f79666ef2ba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-02-08 Tobias Schl"uter + + * gfortran.dg/substr_1.f90: New test. + 2005-02-07 Richard Guenther PR middle-end/19775 diff --git a/gcc/testsuite/gfortran.dg/substr_1.f90 b/gcc/testsuite/gfortran.dg/substr_1.f90 new file mode 100644 index 00000000000..15ab390f906 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/substr_1.f90 @@ -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 +