diff options
author | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-12 20:29:21 +0000 |
---|---|---|
committer | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-12 20:29:21 +0000 |
commit | 3923b69f425942813467f05a97628cce628cb260 (patch) | |
tree | 162f353f0d18f7abe39f8eb26326940ad6f0a652 /gcc | |
parent | 8c84a5de8ea015ec2e463b480ec81f03671b1e43 (diff) | |
download | gcc-3923b69f425942813467f05a97628cce628cb260.tar.gz |
2005-10-12 Paul Thomas <pault@gcc.gnu.org>
PR fortran/18082
* decl.c (variable_decl): Make a new copy of the character
length for each variable, when the expression is not a
constant.
2005-10-12 Paul Thomas <pault@gcc.gnu.org>
PR fortran/18082
gfortran.dg/automatic_char_len_1.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105329 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rwxr-xr-x | gcc/testsuite/gfortran.dg/automatic_char_len_1.f90 | 11 |
4 files changed, 42 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 91acbf2e5a9..94e2418acf6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-10-12 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/18082 + * decl.c (variable_decl): Make a new copy of the character + length for each variable, when the expression is not a + constant. + 2005-10-12 Francois-Xavier Coudert <coudert@clipper.ens.fr> * gfortran.h: Add bitmasks for different FPE traps. Add fpe diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 8c4ce585e43..20d1f8a2d20 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -900,7 +900,7 @@ gfc_match_null (gfc_expr ** result) symbol table or the current interface. */ static match -variable_decl (void) +variable_decl (int elem) { char name[GFC_MAX_SYMBOL_LEN + 1]; gfc_expr *initializer, *char_len; @@ -944,8 +944,20 @@ variable_decl (void) cl->length = char_len; break; + /* Non-constant lengths need to be copied after the first + element. */ case MATCH_NO: - cl = current_ts.cl; + if (elem > 1 && current_ts.cl->length + && current_ts.cl->length->expr_type != EXPR_CONSTANT) + { + cl = gfc_get_charlen (); + cl->next = gfc_current_ns->cl_list; + gfc_current_ns->cl_list = cl; + cl->length = gfc_copy_expr (current_ts.cl->length); + } + else + cl = current_ts.cl; + break; case MATCH_ERROR: @@ -1944,6 +1956,7 @@ gfc_match_data_decl (void) { gfc_symbol *sym; match m; + int elem; m = match_type_spec (¤t_ts, 0); if (m != MATCH_YES) @@ -1995,10 +2008,12 @@ ok: if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector) gfc_match_char (','); - /* Give the types/attributes to symbols that follow. */ + /* Give the types/attributes to symbols that follow. Give the element + a number so that repeat character length expressions can be copied. */ + elem = 1; for (;;) { - m = variable_decl (); + m = variable_decl (elem++); if (m == MATCH_ERROR) goto cleanup; if (m == MATCH_NO) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 366ef0a073e..7abf169d217 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2005-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/18082 + gfortran.dg/automatic_char_len_1.f90: New test. + +2005-10-12 Paul Thomas <pault@gcc.gnu.org> + PR fortran/20847 gfortran.dg/save_common.f90: New test. diff --git a/gcc/testsuite/gfortran.dg/automatic_char_len_1.f90 b/gcc/testsuite/gfortran.dg/automatic_char_len_1.f90 new file mode 100755 index 00000000000..3ccfcb70de8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/automatic_char_len_1.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! PR18082 - Compiler would get stuck in loop, whilst treating +! the assignments. +! Test is one of PR cases. +subroutine snafu (i) +character*(i) :: c1, c2 +c1 = "" +c2 = "" +end subroutine snafu + + |