aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Fischer <aldot@gcc.gnu.org>2006-11-01 00:38:58 +0100
committerBernhard Reutner-Fischer <aldot@gcc.gnu.org>2006-11-01 00:38:58 +0100
commit4143349751326d2804faad1a7d2cc55e647bd4ad (patch)
treec625ef375d766085812e0b32d7cc941024b9531e
parentaf9d09936281796e6341ad77b210f5a9b257aad3 (diff)
downloadgcc-4143349751326d2804faad1a7d2cc55e647bd4ad.zip
gcc-4143349751326d2804faad1a7d2cc55e647bd4ad.tar.gz
gcc-4143349751326d2804faad1a7d2cc55e647bd4ad.tar.bz2
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
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/match.c7
-rw-r--r--gcc/fortran/trans-common.c11
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/blockdata_1.f902
-rw-r--r--gcc/testsuite/gfortran.dg/blockdata_2.f908
6 files changed, 39 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 84804f9..e9ba75f 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 3f393856..5012c35 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 5350eac..83da32f 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 f6f95b3..12e6d5d 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 5c475f1..81cd02c 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 0000000..a1370c8
--- /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