fortran/
authortobi <tobi@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Feb 2005 13:41:08 +0000 (13:41 +0000)
committertobi <tobi@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Feb 2005 13:41:08 +0000 (13:41 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94735 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/module.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/substr_1.f90 [new file with mode: 0644]

index 25bc317..b1918a3 100644 (file)
@@ -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,
index 87ce3e5..3898f7a 100644 (file)
@@ -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);
 
index 3670a3a..12d52c4 100644 (file)
@@ -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:
index 4e93d07..f79666e 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/substr_1.f90 b/gcc/testsuite/gfortran.dg/substr_1.f90
new file mode 100644 (file)
index 0000000..15ab390
--- /dev/null
@@ -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
+