From 4143349751326d2804faad1a7d2cc55e647bd4ad Mon Sep 17 00:00:00 2001
From: Bernhard Fischer <aldot@gcc.gnu.org>
Date: Wed, 1 Nov 2006 00:38:58 +0100
Subject: [PATCH] re PR fortran/29537 (ICE in gfc_match_common for blank common
 in BLOCK DATA unit)

fortran/ChangeLog:
2006-11-01  Bernhard Fischer  <aldot@gcc.gnu.org>

        PR fortran/29537
        * trans-common.c (gfc_trans_common): If the blank common is
        in a procedure or program without a name then proc_name is null, so use
        the locus of the common.
        (gfc_sym_mangled_common_id): Fix whitespace.
        * match.c (gfc_match_common): Emit warning about blank common in
        block data.

testsuite/ChangeLog:
2006-11-01  Bernhard Fischer  <aldot@gcc.gnu.org>

        PR fortran/29537
        * gfortran.dg/blockdata_1.f90: Add warning about blank common in block
	data.
        * gfortran.dg/blockdata_2.f90: New testcase.

From-SVN: r118347
---
 gcc/fortran/ChangeLog                     | 10 ++++++++++
 gcc/fortran/match.c                       |  7 +++++--
 gcc/fortran/trans-common.c                | 11 ++++++++---
 gcc/testsuite/ChangeLog                   |  7 +++++++
 gcc/testsuite/gfortran.dg/blockdata_1.f90 |  2 +-
 gcc/testsuite/gfortran.dg/blockdata_2.f90 |  8 ++++++++
 6 files changed, 39 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/blockdata_2.f90

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 84804f944697..e9ba75fe3b4b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,13 @@
+2006-11-01  Bernhard Fischer  <aldot@gcc.gnu.org>
+
+	PR fortran/29537
+	* trans-common.c (gfc_trans_common): If the blank common is
+	in a procedure or program without a name then proc_name is null, so
+	use the locus of the common.
+	(gfc_sym_mangled_common_id): Fix whitespace.
+	* match.c (gfc_match_common): Emit warning about blank common in
+	block data.
+
 2006-10-31  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
 	PR fortran/29067
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 3f393856798e..5012c3588ee3 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -2327,16 +2327,19 @@ gfc_match_common (void)
 
       if (name[0] == '\0')
 	{
+	  if (gfc_current_ns->is_block_data)
+	    {
+	      gfc_warning ("BLOCK DATA unit cannot contain blank COMMON at %C");
+	    }
 	  t = &gfc_current_ns->blank_common;
 	  if (t->head == NULL)
 	    t->where = gfc_current_locus;
-	  head = &t->head;
 	}
       else
 	{
 	  t = gfc_get_common (name, 0);
-	  head = &t->head;
 	}
+      head = &t->head;
 
       if (*head == NULL)
 	tail = NULL;
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index 5350eacdef05..83da32f52347 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -219,7 +219,7 @@ add_segments (segment_info *list, segment_info *v)
 /* Construct mangled common block name from symbol name.  */
 
 static tree
-gfc_sym_mangled_common_id (const char  *name)
+gfc_sym_mangled_common_id (const char *name)
 {
   int has_underscore;
   char mangled_name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
@@ -1054,13 +1054,18 @@ gfc_trans_common (gfc_namespace *ns)
   if (ns->blank_common.head != NULL)
     {
       c = gfc_get_common_head ();
+
       /* We've lost the real location, so use the location of the
 	 enclosing procedure.  */
-      c->where = ns->proc_name->declared_at;
+      if (ns->proc_name != NULL)
+	c->where = ns->proc_name->declared_at;
+      else
+	c->where = ns->blank_common.head->common_head->where;
+
       strcpy (c->name, BLANK_COMMON_NAME);
       translate_common (c, ns->blank_common.head);
     }
- 
+
   /* Translate all named common blocks.  */
   gfc_traverse_symtree (ns->common_root, named_common);
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f6f95b315909..12e6d5d58a0b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2006-11-01  Bernhard Fischer  <aldot@gcc.gnu.org>
+
+	PR fortran/29537
+	* gfortran.dg/blockdata_1.f90: Add warning about blank common in block
+	data.
+	* gfortran.dg/blockdata_2.f90: New testcase.
+
 2006-10-31  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR libfortran/29627
diff --git a/gcc/testsuite/gfortran.dg/blockdata_1.f90 b/gcc/testsuite/gfortran.dg/blockdata_1.f90
index 5c475f1d0f4e..81cd02cc90b5 100644
--- a/gcc/testsuite/gfortran.dg/blockdata_1.f90
+++ b/gcc/testsuite/gfortran.dg/blockdata_1.f90
@@ -14,7 +14,7 @@ end blockdata d1
 
 block data d2
  common /b/ u
- common j
+ common j ! { dg-warning "cannot contain blank COMMON" }
  data j /1/
 end block data d2
 !
diff --git a/gcc/testsuite/gfortran.dg/blockdata_2.f90 b/gcc/testsuite/gfortran.dg/blockdata_2.f90
new file mode 100644
index 000000000000..a1370c8b54b8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/blockdata_2.f90
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! Test for pr29537 where we did ICE trying to dereference the NULL
+! proc_name from an unnamed block data which we intended to use as locus
+! for a blank common.
+block data
+  common c ! { dg-warning "cannot contain blank COMMON" }
+end !block data
+end