diff options
author | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-11-06 20:05:12 +0000 |
---|---|---|
committer | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-11-06 20:05:12 +0000 |
commit | c8df3e9ccbe09ae750aa04482db2dfa8a6687cea (patch) | |
tree | cf705dd04dbbcc1d3afb58821a83148e48c5ea47 /gcc/fortran | |
parent | 776a1f2d0f4643b65f0470ae3402daf2272ed48d (diff) | |
download | ppe42-gcc-c8df3e9ccbe09ae750aa04482db2dfa8a6687cea.tar.gz ppe42-gcc-c8df3e9ccbe09ae750aa04482db2dfa8a6687cea.zip |
2005-11-06 Paul Thomas <pault@gcc.gnu.org>
PR fortran/24534
* resolve.c (resolve_symbol): Exclude case of PRIVATE declared
within derived type from error associated with PRIVATE type
components within derived type.
PR fortran/20838
PR fortran/20840
* gfortran.h: Add prototype for gfc_has_vector_index.
* io.c (gfc_resolve_dt): Error if internal unit has a vector index.
* expr.c (gfc_has_vector_index): New function to check if any of
the array references of an expression have vector inidices.
(gfc_check_pointer_assign): Error if internal unit has a vector index.
PR fortran/17737
* data.c (gfc_assign_data_value): Remove gcc_assert that caused the ICE
and replace by a standard dependent warning/error if overwriting an
existing initialization.
* decl.c (gfc_data_variable): Remove old error for already initialized
variable and the unused error check for common block variables. Add
error for hots associated variable and standard dependent error for
common block variables, outside of blockdata.
* symbol.c (check_conflict): Add constraints for DATA statement.
2005-11-06 Paul Thomas <pault@gcc.gnu.org>
PR fortran/24534
gfortran.dg/private_type_2.f90: Modified to check that case with
PRIVATE declaration within derived type is accepted.
PR fortran/20838
gfortran.dg/pointer_assign_1.f90: New test.
PR fortran/20840
* gfortran.dg/arrayio_0.f90: New test.
PR fortran/17737
gfortran.dg/data_initialized.f90: New test.
gfortran.dg/data_constraints_1.f90: New test.
gfortran.dg/data_constraints_2.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106567 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 25 | ||||
-rw-r--r-- | gcc/fortran/data.c | 15 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 23 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 24 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 1 | ||||
-rw-r--r-- | gcc/fortran/io.c | 7 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 6 | ||||
-rw-r--r-- | gcc/fortran/symbol.c | 8 |
8 files changed, 90 insertions, 19 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d7da455b3d4..60b20b76970 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,28 @@ +2005-11-06 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/24534 + * resolve.c (resolve_symbol): Exclude case of PRIVATE declared + within derived type from error associated with PRIVATE type + components within derived type. + + PR fortran/20838 + PR fortran/20840 + * gfortran.h: Add prototype for gfc_has_vector_index. + * io.c (gfc_resolve_dt): Error if internal unit has a vector index. + * expr.c (gfc_has_vector_index): New function to check if any of + the array references of an expression have vector inidices. + (gfc_check_pointer_assign): Error if internal unit has a vector index. + + PR fortran/17737 + * data.c (gfc_assign_data_value): Remove gcc_assert that caused the ICE + and replace by a standard dependent warning/error if overwriting an + existing initialization. + * decl.c (gfc_data_variable): Remove old error for already initialized + variable and the unused error check for common block variables. Add + error for hots associated variable and standard dependent error for + common block variables, outside of blockdata. + * symbol.c (check_conflict): Add constraints for DATA statement. + 2005-11-06 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/24174 diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c index d614db4a084..fdb98569c7a 100644 --- a/gcc/fortran/data.c +++ b/gcc/fortran/data.c @@ -315,8 +315,19 @@ gfc_assign_data_value (gfc_expr * lvalue, gfc_expr * rvalue, mpz_t index) expr = create_character_intializer (init, last_ts, ref, rvalue); else { - /* We should never be overwriting an existing initializer. */ - gcc_assert (!init); + /* Overwriting an existing initializer is non-standard but usually only + provokes a warning from other compilers. */ + if (init != NULL) + { + /* Order in which the expressions arrive here depends on whether they + are from data statements or F95 style declarations. Therefore, + check which is the most recent. */ + expr = (init->where.lb->linenum > rvalue->where.lb->linenum) ? + init : rvalue; + gfc_notify_std (GFC_STD_GNU, "Extension: re-initialization " + "of '%s' at %L", symbol->name, &expr->where); + return; + } expr = gfc_copy_expr (rvalue); if (!gfc_compare_types (&lvalue->ts, &expr->ts)) diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index aaad320971b..8352c527461 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -203,24 +203,19 @@ var_element (gfc_data_variable * new) sym = new->expr->symtree->n.sym; - if(sym->value != NULL) + if (!sym->attr.function && gfc_current_ns->parent && gfc_current_ns->parent == sym->ns) { - gfc_error ("Variable '%s' at %C already has an initialization", - sym->name); + gfc_error ("Host associated variable '%s' may not be in the DATA " + "statement at %C.", sym->name); return MATCH_ERROR; } -#if 0 /* TODO: Find out where to move this message */ - 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->head) - { - gfc_error ("DATA statement at %C may not initialize variable " - "'%s' from blank COMMON", sym->name); - return MATCH_ERROR; - } -#endif + if (gfc_current_state () != COMP_BLOCK_DATA + && sym->attr.in_common + && gfc_notify_std (GFC_STD_GNU, "Extension: initialization of " + "common block variable '%s' in DATA statement at %C", + sym->name) == FAILURE) + return MATCH_ERROR; if (gfc_add_data (&sym->attr, sym->name, &new->expr->where) == FAILURE) return MATCH_ERROR; diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 80099df5ad4..1ceec01eae0 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -311,6 +311,23 @@ copy_ref (gfc_ref * src) } +/* Detect whether an expression has any vector index array + references. */ + +int +gfc_has_vector_index (gfc_expr *e) +{ + gfc_ref * ref; + int i; + for (ref = e->ref; ref; ref = ref->next) + if (ref->type == REF_ARRAY) + for (i = 0; i < ref->u.ar.dimen; i++) + if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR) + return 1; + return 0; +} + + /* Copy a shape array. */ mpz_t * @@ -1962,6 +1979,13 @@ gfc_check_pointer_assign (gfc_expr * lvalue, gfc_expr * rvalue) return FAILURE; } + if (gfc_has_vector_index (rvalue)) + { + gfc_error ("Pointer assignment with vector subscript " + "on rhs at %L", &rvalue->where); + return FAILURE; + } + return SUCCESS; } diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 96bd38666ba..5626cc986a7 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1790,6 +1790,7 @@ void gfc_free_ref_list (gfc_ref *); void gfc_type_convert_binary (gfc_expr *); int gfc_is_constant_expr (gfc_expr *); try gfc_simplify_expr (gfc_expr *, int); +int gfc_has_vector_index (gfc_expr *); gfc_expr *gfc_get_expr (void); void gfc_free_expr (gfc_expr *); diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index 9f459c68363..183948e5788 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -1787,6 +1787,13 @@ gfc_resolve_dt (gfc_dt * dt) /* Sanity checks on data transfer statements. */ if (e->ts.type == BT_CHARACTER) { + if (gfc_has_vector_index (e)) + { + gfc_error ("Internal unit with vector subscript at %L", + &e->where); + return FAILURE; + } + if (dt->rec != NULL) { gfc_error ("REC tag at %L is incompatible with internal file", diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 6db0f1e6a44..50d22b0ea83 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -4358,9 +4358,11 @@ resolve_symbol (gfc_symbol * sym) return; } - /* Ensure that derived type components of a public derived type - are not of a private type. */ + /* If a component of a derived type is of a type declared to be private, + either the derived type definition must contain the PRIVATE statement, + or the derived type must be private. (4.4.1 just after R427) */ if (sym->attr.flavor == FL_DERIVED + && sym->component_access != ACCESS_PRIVATE && gfc_check_access(sym->attr.access, sym->ns->default_access)) { for (c = sym->components; c; c = c->next) diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 43209e4ccae..20fb7470dff 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -264,7 +264,7 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where) *function = "FUNCTION", *subroutine = "SUBROUTINE", *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE", *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER", - *cray_pointee = "CRAY POINTEE"; + *cray_pointee = "CRAY POINTEE", *data = "DATA"; const char *a1, *a2; @@ -373,6 +373,12 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where) conf (cray_pointee, in_common); conf (cray_pointee, in_equivalence); + conf (data, dummy); + conf (data, function); + conf (data, result); + conf (data, allocatable); + conf (data, use_assoc); + a1 = gfc_code2string (flavors, attr->flavor); if (attr->in_namelist |