From 9b089e0545b2b8f6455c91584714e5ab918dfac6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tobias=20Schl=C3=BCter?= Date: Fri, 14 May 2004 15:46:05 +0200 Subject: [PATCH] re PR fortran/14066 (Infinite DO loops not recognized.) fortran: PR fortran/14066 * match.c (gfc_match_do): Allow infinite loops with label-do-stmt. Do not enforce space after comma. testsuite: PR fortran/14066 * gfortran.fortran-torture/compile/do_1.f90: New test. Also fixed date on previous ChangeLog entries. From-SVN: r81842 --- gcc/fortran/ChangeLog | 12 +++++++--- gcc/fortran/match.c | 14 +++++------ gcc/testsuite/ChangeLog | 5 ++++ .../gfortran.fortran-torture/compile/do_1.f90 | 28 ++++++++++++++++++++++ 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gfortran.fortran-torture/compile/do_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ab9f8ba..9e3741a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,10 +1,16 @@ -2004-05-08 Tobias Schlueter +2004-05-14 Tobias Schlueter + + PR fortran/14066 + * match.c (gfc_match_do): Allow infinite loops with + label-do-stmt. Do not enforce space after comma. + +2004-05-14 Tobias Schlueter PR fortran/15051 * parse.c (parse_interface): Allow empty INTERFACE, remove seen_body. -2004-05-08 Tobias Schlueter +2004-05-14 Tobias Schlueter * Make-lang.in, arith.c, arith.h, array.c, bbt.c, check.c, decl.c, dependency.c, dependency.h, dump-parse-tree.c, error.c, @@ -20,7 +26,7 @@ * data.c: Likewise, also removed two whitespace-only lines. * gfortranspec.c, lang.opt: Update copyright years. -2004-04-22 Tobias Schlueter +2004-05-14 Tobias Schlueter PR fortran/14568 * trans-decl.c (generate_local_decl): Don't warn for unused diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 28fe7a6..fc5afbf 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -1203,6 +1203,10 @@ gfc_match_do (void) if (gfc_match (" do") != MATCH_YES) return MATCH_NO; + m = gfc_match_st_label (&label, 0); + if (m == MATCH_ERROR) + goto cleanup; + /* Match an infinite DO, make it like a DO WHILE(.TRUE.) */ if (gfc_match_eos () == MATCH_YES) @@ -1212,13 +1216,9 @@ gfc_match_do (void) goto done; } - m = gfc_match_st_label (&label, 0); - if (m == MATCH_ERROR) - goto cleanup; - - gfc_match_char (','); - - if (gfc_match ("% ") != MATCH_YES) + /* match an optional comma, if no comma is found a space is obligatory. */ + if (gfc_match_char(',') != MATCH_YES + && gfc_match ("% ") != MATCH_YES) return MATCH_NO; /* See if we have a DO WHILE. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6baf19a..216d3e8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2004-05-14 Tobias Schlueter + PR fortran/14066 + * gfortran.fortran-torture/compile/do_1.f90: New test. + +2004-05-14 Tobias Schlueter + PR fortran/15051 * gfortran.fortran-torture/compile/empty_interface_1.f90: New test. diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/do_1.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/do_1.f90 new file mode 100644 index 0000000..396592c --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/do_1.f90 @@ -0,0 +1,28 @@ +! test various forms of the DO statement +! inspired by PR14066 +LOGICAL L +DO i=1,10 +END DO +DO 10 i=1,20 + DO 20,j=1,10,2 +20 CONTINUE +10 END DO +L = .TRUE. +DO WHILE(L) + L = .FALSE. +END DO +DO 50 WHILE(.NOT.L) + L = .TRUE. +50 CONTINUE +DO + DO 30 + DO 40 +40 CONTINUE +30 END DO +END DO +outer: DO i=1,20 + inner: DO,j=i,30 + IF (j.EQ.2*i) CYCLE outer + END DO inner +END DO outer +END -- 2.7.4