aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorErik Edelmann <eedelman@gcc.gnu.org>2006-01-25 20:46:29 +0000
committerErik Edelmann <eedelman@gcc.gnu.org>2006-01-25 20:46:29 +0000
commit810306f2c59b89ac1596eff596ffee5354d4225c (patch)
tree694499b865196daad78324da54b88dbc40acd07e /gcc
parent5c45cecb25efa7898108694021f221c46429347c (diff)
downloadgcc-810306f2c59b89ac1596eff596ffee5354d4225c.zip
gcc-810306f2c59b89ac1596eff596ffee5354d4225c.tar.gz
gcc-810306f2c59b89ac1596eff596ffee5354d4225c.tar.bz2
re PR fortran/25716 (FAIL: gfortran.dg/char_result_11.f90 -O (test for excess errors))
fortran/ 2005-01-25 Erik Edelmann <eedelman@gcc.gnu.org> PR fortran/25716 * symbol.c (free_old_symbol): New function. (gfc_commit_symbols): Use it. (gfc_commit_symbol): New function. (gfc_use_derived): Use it. * gfortran.h: Add prototype for gfc_commit_symbol. * intrinsic.c (gfc_find_function): Search in 'conversion' if not found in 'functions'. (gfc_convert_type_warn): Add a symtree to the new expression node, and commit the new symtree->n.sym. * resolve.c (gfc_resolve_index): Make sure typespec is properly initialized. testsuite/ 2005-01-25 Erik Edelmann <eedelman@gcc.gnu.org> PR fortran/25716 * gfortran.dg/char_result_11.f90: Make it sensitive to PR 25716 on 32-bit systems too. From-SVN: r110225
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog15
-rw-r--r--gcc/fortran/gfortran.h1
-rw-r--r--gcc/fortran/intrinsic.c17
-rw-r--r--gcc/fortran/resolve.c1
-rw-r--r--gcc/fortran/symbol.c67
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/char_result_11.f908
7 files changed, 95 insertions, 20 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 9263d8a..a6904954f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,18 @@
+2005-01-25 Erik Edelmann <eedelman@gcc.gnu.org>
+
+ PR fortran/25716
+ * symbol.c (free_old_symbol): New function.
+ (gfc_commit_symbols): Use it.
+ (gfc_commit_symbol): New function.
+ (gfc_use_derived): Use it.
+ * gfortran.h: Add prototype for gfc_commit_symbol.
+ * intrinsic.c (gfc_find_function): Search in 'conversion'
+ if not found in 'functions'.
+ (gfc_convert_type_warn): Add a symtree to the new
+ expression node, and commit the new symtree->n.sym.
+ * resolve.c (gfc_resolve_index): Make sure typespec is
+ properly initialized.
+
2005-01-23 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25901
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index a26eab0..c14b04d 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1771,6 +1771,7 @@ int gfc_symbols_could_alias (gfc_symbol *, gfc_symbol *);
void gfc_undo_symbols (void);
void gfc_commit_symbols (void);
+void gfc_commit_symbol (gfc_symbol * sym);
void gfc_free_namespace (gfc_namespace *);
void gfc_symbol_init_2 (void);
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 7963eec..cc63a5f 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -711,8 +711,13 @@ find_sym (gfc_intrinsic_sym * start, int n, const char *name)
gfc_intrinsic_sym *
gfc_find_function (const char *name)
{
+ gfc_intrinsic_sym *sym;
+
+ sym = find_sym (functions, nfunc, name);
+ if (!sym)
+ sym = find_sym (conversion, nconv, name);
- return find_sym (functions, nfunc, name);
+ return sym;
}
@@ -3415,6 +3420,16 @@ gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
new->rank = rank;
new->shape = gfc_copy_shape (shape, rank);
+ gfc_get_ha_sym_tree (sym->name, &new->symtree);
+ new->symtree->n.sym->ts = *ts;
+ new->symtree->n.sym->attr.flavor = FL_PROCEDURE;
+ new->symtree->n.sym->attr.function = 1;
+ new->symtree->n.sym->attr.intrinsic = 1;
+ new->symtree->n.sym->attr.elemental = 1;
+ new->symtree->n.sym->attr.pure = 1;
+ new->symtree->n.sym->attr.referenced = 1;
+ gfc_commit_symbol (new->symtree->n.sym);
+
*expr = *new;
gfc_free (new);
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 1d8a71b..e94a926 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -2088,6 +2088,7 @@ gfc_resolve_index (gfc_expr * index, int check_scalar)
if (index->ts.kind != gfc_index_integer_kind
|| index->ts.type != BT_INTEGER)
{
+ gfc_clear_ts (&ts);
ts.type = BT_INTEGER;
ts.kind = gfc_index_integer_kind;
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 9a28df6..33af725 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -1345,7 +1345,7 @@ switch_types (gfc_symtree * st, gfc_symbol * from, gfc_symbol * to)
gfc_symbol *
gfc_use_derived (gfc_symbol * sym)
{
- gfc_symbol *s, *p;
+ gfc_symbol *s;
gfc_typespec *t;
gfc_symtree *st;
int i;
@@ -1379,15 +1379,7 @@ gfc_use_derived (gfc_symbol * sym)
s->refs++;
/* Unlink from list of modified symbols. */
- if (changed_syms == sym)
- changed_syms = sym->tlink;
- else
- for (p = changed_syms; p; p = p->tlink)
- if (p->tlink == sym)
- {
- p->tlink = sym->tlink;
- break;
- }
+ gfc_commit_symbol (sym);
switch_types (sym->ns->sym_root, sym, s);
@@ -2238,6 +2230,26 @@ gfc_undo_symbols (void)
}
+/* Free sym->old_symbol. sym->old_symbol is mostly a shallow copy of sym; but
+ few components might have been given new values. */
+
+static void
+free_old_symbol (gfc_symbol * sym)
+{
+ if (sym->old_symbol == NULL)
+ return;
+
+ if (sym->old_symbol->as != sym->as)
+ gfc_free_array_spec (sym->old_symbol->as);
+
+ if (sym->old_symbol->value != sym->value)
+ gfc_free_expr (sym->old_symbol->value);
+
+ gfc_free (sym->old_symbol);
+ sym->old_symbol = NULL;
+}
+
+
/* Makes the changes made in the current statement permanent-- gets
rid of undo information. */
@@ -2253,17 +2265,40 @@ gfc_commit_symbols (void)
p->mark = 0;
p->new = 0;
- if (p->old_symbol != NULL)
- {
- gfc_free (p->old_symbol);
- p->old_symbol = NULL;
- }
+ free_old_symbol (p);
}
-
changed_syms = NULL;
}
+/* Makes the changes made in one symbol permanent -- gets rid of undo
+ information. */
+
+void
+gfc_commit_symbol (gfc_symbol * sym)
+{
+ gfc_symbol *p;
+
+ if (changed_syms == sym)
+ changed_syms = sym->tlink;
+ else
+ {
+ for (p = changed_syms; p; p = p->tlink)
+ if (p->tlink == sym)
+ {
+ p->tlink = sym->tlink;
+ break;
+ }
+ }
+
+ sym->tlink = NULL;
+ sym->mark = 0;
+ sym->new = 0;
+
+ free_old_symbol (sym);
+}
+
+
/* Recursive function that deletes an entire tree and all the common
head structures it points to. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a9e05c5..2ef9cc8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-01-25 Erik Edelmann <eedelman@gcc.gnu.org>
+
+ PR fortran/25716
+ * gfortran.dg/char_result_11.f90: Make it sensitive to PR
+ 25716 on 32-bit systems too.
+
2006-01-25 Kazu Hirata <kazu@codesourcery.com>
PR testsuite/25590
diff --git a/gcc/testsuite/gfortran.dg/char_result_11.f90 b/gcc/testsuite/gfortran.dg/char_result_11.f90
index ff10b1a..19a5c96 100644
--- a/gcc/testsuite/gfortran.dg/char_result_11.f90
+++ b/gcc/testsuite/gfortran.dg/char_result_11.f90
@@ -1,5 +1,6 @@
-! { dg-do compile }
-! PR 23675: Character function of module variable length
+! { dg-do link }
+! PR 23675: Character function of module-variable length
+! PR 25716: Implicit kind conversions in in expressions written to *.mod-files.
module cutils
implicit none
@@ -11,7 +12,8 @@ module cutils
end type t
integer :: m1 = 25, m2 = 25, m3 = 25, m4 = 25, m5 = 25
- integer :: n1 = 3, n2 = 3, n3 = 3, n4 = 3, n5 = 3, n6 = 3, n7 = 3, n8 = 3, n9 = 3
+ integer :: n5 = 3, n7 = 3, n9 = 3
+ integer(1) :: n1 = 3, n2 = 3, n3 = 3, n4 = 3, n6 = 3, n8 = 3
character(10) :: s = "abcdefghij"
integer :: x(4) = (/ 30, 40, 50, 60 /)
type(t) :: tt1(5), tt2(5)