re PR fortran/25716 (FAIL: gfortran.dg/char_result_11.f90 -O (test for excess errors))
authorErik Edelmann <eedelman@gcc.gnu.org>
Wed, 25 Jan 2006 20:46:29 +0000 (20:46 +0000)
committerErik Edelmann <eedelman@gcc.gnu.org>
Wed, 25 Jan 2006 20:46:29 +0000 (20:46 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/intrinsic.c
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/char_result_11.f90

index 9263d8aeb0810493ecfd61ab05cd6a27bf1272ce..a6904954f789c653b73fb576206b75c226d5428d 100644 (file)
@@ -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
index a26eab07a9cdc01ce5674f1bfac54f723903fef1..c14b04dac6d94b1744bc5bb16343de7243e67a0a 100644 (file)
@@ -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);
index 7963eec8216a6717c6e52b37e54e93a4aa97d458..cc63a5f66fc3a0ced9392af6b0b01c0b6316132d 100644 (file)
@@ -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);
index 1d8a71b371db1b421de66a6d8a19fb4610b54379..e94a92653306c7fe23a662e6f7d5e8341afe0969 100644 (file)
@@ -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;
 
index 9a28df64dc4f1a50eb67766894dff551def83bd6..33af725d72e85da3a7afe16a211956774491ec79 100644 (file)
@@ -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.  */
 
index a9e05c54fd56dfe20cf599361ca88d9c34d47fc8..2ef9cc82eeef98f7c65c717e2e14b33ed22ef419 100644 (file)
@@ -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
index ff10b1afdc7902df5d54223b55c0845cbabf1b16..19a5c9662fd8c4d94325347996f38169836adc01 100644 (file)
@@ -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)