summaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2012-01-16 20:50:11 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2012-01-16 20:50:11 +0100
commit22c30bc09a6ff27638521bd82ac5e25c525f1273 (patch)
tree2dcdb80d1e52c4767c27a1030fe645cf115655e9 /gcc/fortran
parent645c7a55f8861f10f68f3e7fc2ce86fa57fb6b15 (diff)
downloadgcc-22c30bc09a6ff27638521bd82ac5e25c525f1273.tar.gz
re PR fortran/51809 ([OOP] ICE (segfault) depending on USE statements order)
2012-01-16 Tobias Burnus <burnus@net-b.de> PR fortran/51809 * class.c (gfc_find_derived_vtab): Mark __vtab and __def_init as FL_VARIABLE not as FL_PARAMETER. * expr.c (gfc_simplify_expr): Remove special handling of __vtab. * resolve.c (resolve_values): Ditto. * trans-decl.c (gfc_get_symbol_decl): Mark __vtab and __def_init as TREE_READONLY. 2012-01-16 Tobias Burnus <burnus@net-b.de> PR fortran/51809 * gfortran.dg/use_20.f90: New From-SVN: r183219
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog11
-rw-r--r--gcc/fortran/class.c4
-rw-r--r--gcc/fortran/expr.c3
-rw-r--r--gcc/fortran/resolve.c4
-rw-r--r--gcc/fortran/trans-decl.c5
5 files changed, 20 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 14c226ae137..4fd31382f56 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,14 @@
+2012-01-16 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/51809
+ * class.c (gfc_find_derived_vtab): Mark __vtab and
+ __def_init as FL_VARIABLE not as FL_PARAMETER.
+ * expr.c (gfc_simplify_expr): Remove special
+ handling of __vtab.
+ * resolve.c (resolve_values): Ditto.
+ * trans-decl.c (gfc_get_symbol_decl): Mark __vtab
+ and __def_init as TREE_READONLY.
+
2012-01-16 Paul Thomas <pault@gcc.gnu.org>
* trans-array.c (gfc_trans_create_temp_array): In the case of a
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index a17fc0a1fa5..5e5de1400e6 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -588,7 +588,7 @@ gfc_find_derived_vtab (gfc_symbol *derived)
{
gfc_get_symbol (name, ns, &vtab);
vtab->ts.type = BT_DERIVED;
- if (gfc_add_flavor (&vtab->attr, FL_PARAMETER, NULL,
+ if (gfc_add_flavor (&vtab->attr, FL_VARIABLE, NULL,
&gfc_current_locus) == FAILURE)
goto cleanup;
vtab->attr.target = 1;
@@ -682,7 +682,7 @@ gfc_find_derived_vtab (gfc_symbol *derived)
def_init->attr.target = 1;
def_init->attr.save = SAVE_IMPLICIT;
def_init->attr.access = ACCESS_PUBLIC;
- def_init->attr.flavor = FL_PARAMETER;
+ def_init->attr.flavor = FL_VARIABLE;
gfc_set_sym_referenced (def_init);
def_init->ts.type = BT_DERIVED;
def_init->ts.u.derived = derived;
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index a6baa68168f..8f04c731077 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -1883,8 +1883,7 @@ gfc_simplify_expr (gfc_expr *p, int type)
initialization expression, or we want a subsection. */
if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
&& (gfc_init_expr_flag || p->ref
- || p->symtree->n.sym->value->expr_type != EXPR_ARRAY)
- && !p->symtree->n.sym->attr.vtab)
+ || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
{
if (simplify_parameter_variable (p, type) == FAILURE)
return FAILURE;
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 352d22d0e01..c169b9efbf1 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -9637,7 +9637,7 @@ resolve_values (gfc_symbol *sym)
{
gfc_try t;
- if (sym->value == NULL || sym->attr.use_assoc)
+ if (sym->value == NULL)
return;
if (sym->value->expr_type == EXPR_STRUCTURE)
@@ -12195,7 +12195,7 @@ resolve_fl_parameter (gfc_symbol *sym)
/* Make sure the types of derived parameters are consistent. This
type checking is deferred until resolution because the type may
refer to a derived type from the host. */
- if (sym->ts.type == BT_DERIVED && sym->value
+ if (sym->ts.type == BT_DERIVED
&& !gfc_compare_types (&sym->ts, &sym->value->ts))
{
gfc_error ("Incompatible derived type in PARAMETER at %L",
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 0761ebb26d1..e8e54c77b79 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -1485,7 +1485,10 @@ gfc_get_symbol_decl (gfc_symbol * sym)
if (sym->attr.vtab
|| (sym->name[0] == '_' && strncmp ("__def_init", sym->name, 10) == 0))
- GFC_DECL_PUSH_TOPLEVEL (decl) = 1;
+ {
+ TREE_READONLY (decl) = 1;
+ GFC_DECL_PUSH_TOPLEVEL (decl) = 1;
+ }
return decl;
}