+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,
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:
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:
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:
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);
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);
--- /dev/null
+! { 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
+