From: Paul Thomas Date: Wed, 12 Oct 2005 20:29:21 +0000 (+0000) Subject: re PR fortran/18082 (Infinite loop with automatic length character objects) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=949d5b72e23ff9df61d122d367bbf334b9004f46;p=gcc.git re PR fortran/18082 (Infinite loop with automatic length character objects) 2005-10-12 Paul Thomas 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 PR fortran/18082 gfortran.dg/automatic_char_len_1.f90: New test. From-SVN: r105329 --- 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 + + 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 * 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,3 +1,8 @@ +2005-10-12 Paul Thomas + + PR fortran/18082 + gfortran.dg/automatic_char_len_1.f90: New test. + 2005-10-12 Paul Thomas PR fortran/20847 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 + +