From 2b3f52a2d0fb22bab9a3fdf94eaaa3d6829608fd Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Sun, 4 Oct 2015 12:30:16 +0000 Subject: [PATCH] Fix fortran common-related error recovery ICE. Upon reverting a symbol in a common block (after throwing an error), the compiler was ICEing because the symbol's common_block field was set, but the symbol was not in the common block's list of symbols. Fixed by both adding the symbol to the common block list and setting the symbol's common_block field at the same time. Furthermore, the gfc_add_in_common call is delayed and its result is ignored, so that its error messages are ignored and the compiler has the opportunity to give a better error message. Another gfc_add_in_common call is added later during resolution to emit again the missing errors. PR fortran/67758 gcc/fortran/ * match.c (gfc_match_common): Delay the common_block pointer assignment after error checking. Delay the call to gfc_add_in_common attribute after the handling of array specs. * resolve.c (resolve_common_vars): Call gfc_add_in_common again. gcc/testsuite/ * gfortran.dg/common_24.f: New. From-SVN: r228457 --- gcc/fortran/ChangeLog | 10 +++++++++- gcc/fortran/match.c | 12 ++++++------ gcc/fortran/resolve.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/common_24.f | 11 +++++++++++ 5 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/common_24.f diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 014d67c621f..cdf27b2e295 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2015-10-04 Mikael Morin + + PR fortran/67758 + * match.c (gfc_match_common): Delay the common_block pointer + assignment after error checking. + Delay the call to gfc_add_in_common attribute after the handling + of array specs. + * resolve.c (resolve_common_vars): Call gfc_add_in_common again. + 2015-10-04 Mikael Morin * resolve.c (resolve_common_vars): Move access to the common @@ -102,7 +111,6 @@ * resolve.c (nonscalar_typebound_assign): Fix typos in comment. - 2015-09-21 Steven G. Kargl PR fortran/67615 diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index a50ec2d1351..2363004208b 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -4330,10 +4330,6 @@ gfc_match_common (void) if (m == MATCH_NO) goto syntax; - /* Store a ref to the common block for error checking. */ - sym->common_block = t; - sym->common_block->refs++; - /* See if we know the current common block is bind(c), and if so, then see if we can check if the symbol is (which it'll need to be). This can happen if the bind(c) attr stmt was @@ -4376,8 +4372,8 @@ gfc_match_common (void) goto cleanup; } - if (!gfc_add_in_common (&sym->attr, sym->name, NULL)) - goto cleanup; + sym->common_block = t; + sym->common_block->refs++; if (tail != NULL) tail->common_next = sym; @@ -4416,6 +4412,10 @@ gfc_match_common (void) } + /* Add the in_common attribute, but ignore the reported errors + if any, and continue matching. */ + gfc_add_in_common (&sym->attr, sym->name, NULL); + sym->common_head = t; /* Check to see if the symbol is already in an equivalence group. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 614d8a99072..e75c2930228 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -918,6 +918,12 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common) for (; csym; csym = csym->common_next) { + /* gfc_add_in_common may have been called before, but the reported errors + have been ignored to continue parsing. + We do the checks again here. */ + if (!csym->attr.use_assoc) + gfc_add_in_common (&csym->attr, csym->name, &common_block->where); + if (csym->value || csym->attr.data) { if (!csym->ns->is_block_data) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 47b79f00b05..85d593da93f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-10-04 Mikael Morin + + PR fortran/67758 + * gfortran.dg/common_24.f: New. + 2015-10-03 Bernd Edlinger * gcc.target/arm/pr67756.c: Fixed warnings. diff --git a/gcc/testsuite/gfortran.dg/common_24.f b/gcc/testsuite/gfortran.dg/common_24.f new file mode 100644 index 00000000000..ea37c2a8660 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/common_24.f @@ -0,0 +1,11 @@ +c { dg-do compile } +c PR fortran/67758 +c +c Check the absence of ICE after emitting the error message +c +c Contributed by Ilya Enkovich + + COMMON /FMCOM / X(80 000 000) + CALL T(XX(A)) + COMMON /FMCOM / XX(80 000 000) ! { dg-error "Unexpected COMMON" } + END -- 2.30.2