summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2009-07-09 16:48:50 +0000
committerPaul Thomas <pault@gcc.gnu.org>2009-07-09 16:48:50 +0000
commit1aafbf99427843b553de817302453bf126592553 (patch)
treebd61b3a419fdbfb15b0bffd0366af71a7b3f9266 /gcc
parent6eba227cb539b391ee9c8798284b885e09289914 (diff)
downloadgcc-1aafbf99427843b553de817302453bf126592553.tar.gz
re PR fortran/40629 (Host association problem)
2008-07-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/40629 * resolve.c (check_host_association): Use the existing accessible symtree and treat function expressions with symbols that have procedure flavor. 2008-07-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/40629 * gfortran.dg/host_assoc_function_9.f90: New test. From-SVN: r149422
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/resolve.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/host_assoc_function_9.f9033
4 files changed, 51 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ceabd6053ba..5b1ed772829 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2008-07-09 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/40629
+ * resolve.c (check_host_association): Use the existing
+ accessible symtree and treat function expressions with
+ symbols that have procedure flavor.
+
2009-07-09 Janus Weil <janus@gcc.gnu.org>
PR fortran/40646
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index e3aba1a1af2..9b091ad0162 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -4402,12 +4402,13 @@ check_host_association (gfc_expr *e)
gfc_free (e->shape);
}
- /* Give the symbol a symtree in the right place! */
- gfc_get_sym_tree (sym->name, gfc_current_ns, &st, false);
- st->n.sym = sym;
+ /* Give the expression the right symtree! */
+ gfc_find_sym_tree (e->symtree->name, NULL, 1, &st);
+ gcc_assert (st != NULL);
- if (old_sym->attr.flavor == FL_PROCEDURE)
- {
+ if (old_sym->attr.flavor == FL_PROCEDURE
+ || e->expr_type == EXPR_FUNCTION)
+ {
/* Original was function so point to the new symbol, since
the actual argument list is already attached to the
expression. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6dc33931754..e04e25e8753 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-09 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/40629
+ * gfortran.dg/host_assoc_function_9.f90: New test.
+
2009-07-09 Janus Weil <janus@gcc.gnu.org>
PR fortran/40646
diff --git a/gcc/testsuite/gfortran.dg/host_assoc_function_9.f90 b/gcc/testsuite/gfortran.dg/host_assoc_function_9.f90
new file mode 100644
index 00000000000..58cae435fb6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/host_assoc_function_9.f90
@@ -0,0 +1,33 @@
+! { dg-do run }
+! Tests the fix for the bug PR40629, in which the reference to 'x'
+! in 'upper' wrongly host-associated with the symbol 'x' at module
+! leve rather than the function.
+!
+! Contributed by Philippe Marguinaud <philippe.marguinaud@meteo.fr>
+!
+MODULE m
+ REAL :: x = 0
+CONTAINS
+ subroutine s
+ call upper
+ call lower
+ CONTAINS
+ SUBROUTINE upper
+ y = x(3,1)
+ if (int(y) .ne. 3) call abort
+ END SUBROUTINE
+ FUNCTION x(n, m)
+ x = m*n
+ END FUNCTION
+ SUBROUTINE lower
+ y = x(2,1)
+ if (int(y) .ne. 2) call abort
+ END SUBROUTINE
+ END SUBROUTINE
+END MODULE
+
+ use m
+ call s
+end
+! { dg-final { cleanup-modules "m" } }
+