mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-29 23:35:55 +08:00
re PR fortran/18082 (Infinite loop with automatic length character objects)
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. From-SVN: r105329
This commit is contained in:
parent
944b8b35a9
commit
949d5b72e2
@ -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
|
||||
|
@ -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)
|
||||
|
@ -1,3 +1,8 @@
|
||||
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
|
||||
|
11
gcc/testsuite/gfortran.dg/automatic_char_len_1.f90
Executable file
11
gcc/testsuite/gfortran.dg/automatic_char_len_1.f90
Executable file
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user