aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/match.c12
-rw-r--r--gcc/fortran/resolve.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/common_24.f11
5 files changed, 37 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 014d67c..cdf27b2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,14 @@
2015-10-04 Mikael Morin <mikael@gcc.gnu.org>
+ 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 <mikael@gcc.gnu.org>
+
* resolve.c (resolve_common_vars): Move access to the common
block's head symbol inside the function.
(resolve_common_blocks, resolve_types): Update callers.
@@ -102,7 +111,6 @@
* resolve.c (nonscalar_typebound_assign): Fix typos in comment.
-
2015-09-21 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67615
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index a50ec2d..2363004 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 614d8a9..e75c293 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 47b79f0..85d593d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-04 Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/67758
+ * gfortran.dg/common_24.f: New.
+
2015-10-03 Bernd Edlinger <bernd.edlinger@hotmail.de>
* 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 0000000..ea37c2a
--- /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 <ienkovich@gcc.gnu.org>
+
+ COMMON /FMCOM / X(80 000 000)
+ CALL T(XX(A))
+ COMMON /FMCOM / XX(80 000 000) ! { dg-error "Unexpected COMMON" }
+ END