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