Commit c8e20bd0 by Tobias Schlüter Committed by Tobias Schlüter

re PR fortran/13742 (Not Implemented: initial values for COMMON or EQUIVALENCE)

PR fortran/13742
* decl.c (add_init_expr_to_sym): Verify that COMMON variable is
not initialized in a disallowed fashion.
* match.c (gfc_match_common): Likewise.
(var_element): Verify that variable is not in the blank COMMON,
if it is in a common.

From-SVN: r81899
parent 3a906f04
2004-05-15 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/13742
* decl.c (add_init_expr_to_sym): Verify that COMMON variable is
not initialized in a disallowed fashion.
* match.c (gfc_match_common): Likewise.
(var_element): Verify that variable is not in the blank COMMON,
if it is in a common.
2004-05-15 Joseph S. Myers <jsm@polyomino.org.uk> 2004-05-15 Joseph S. Myers <jsm@polyomino.org.uk>
* Make-lang.in (f95.generated-manpages): Remove. * Make-lang.in (f95.generated-manpages): Remove.
......
...@@ -276,6 +276,15 @@ add_init_expr_to_sym (const char *name, gfc_expr ** initp, ...@@ -276,6 +276,15 @@ add_init_expr_to_sym (const char *name, gfc_expr ** initp,
return FAILURE; return FAILURE;
} }
if (attr.in_common
&& !attr.data
&& *initp != NULL)
{
gfc_error ("Initializer not allowed for COMMON variable '%s' at %C",
sym->name);
return FAILURE;
}
if (init == NULL) if (init == NULL)
{ {
/* An initializer is required for PARAMETER declarations. */ /* An initializer is required for PARAMETER declarations. */
......
...@@ -2338,6 +2338,19 @@ gfc_match_common (void) ...@@ -2338,6 +2338,19 @@ gfc_match_common (void)
goto cleanup; goto cleanup;
} }
if (sym->value != NULL
&& (common_name == NULL || !sym->attr.data))
{
if (common_name == NULL)
gfc_error ("Previously initialized symbol '%s' in "
"blank COMMON block at %C", sym->name);
else
gfc_error ("Previously initialized symbol '%s' in "
"COMMON block '%s' at %C", sym->name,
common_name->name);
goto cleanup;
}
if (gfc_add_in_common (&sym->attr, NULL) == FAILURE) if (gfc_add_in_common (&sym->attr, NULL) == FAILURE)
goto cleanup; goto cleanup;
...@@ -2814,6 +2827,7 @@ static match ...@@ -2814,6 +2827,7 @@ static match
var_element (gfc_data_variable * new) var_element (gfc_data_variable * new)
{ {
match m; match m;
gfc_symbol *sym, *t;
memset (new, '\0', sizeof (gfc_data_variable)); memset (new, '\0', sizeof (gfc_data_variable));
...@@ -2824,14 +2838,27 @@ var_element (gfc_data_variable * new) ...@@ -2824,14 +2838,27 @@ var_element (gfc_data_variable * new)
if (m != MATCH_YES) if (m != MATCH_YES)
return m; return m;
if (new->expr->symtree->n.sym->value != NULL) sym = new->expr->symtree->n.sym;
if(sym->value != NULL)
{ {
gfc_error ("Variable '%s' at %C already has an initialization", gfc_error ("Variable '%s' at %C already has an initialization",
new->expr->symtree->n.sym->name); sym->name);
return MATCH_ERROR; return MATCH_ERROR;
} }
new->expr->symtree->n.sym->attr.data = 1; if (sym->attr.in_common)
/* See if sym is in the blank common block. */
for (t = sym->ns->blank_common; t; t = t->common_next)
if (sym == t)
{
gfc_error ("DATA statement at %C may not initialize variable "
"'%s' from blank COMMON", sym->name);
return MATCH_ERROR;
}
sym->attr.data = 1;
return MATCH_YES; return MATCH_YES;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment