aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-decl.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/submodule_30.f0842
4 files changed, 57 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 02763fe..ab26650 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2017-10-18 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/82550
+ * trans_decl.c (gfc_get_symbol_decl): Procedure symbols that
+ have the 'used_in_submodule' attribute should be processed by
+ 'gfc_get_extern_function_decl'.
+
2017-10-16 Fritz Reese <fritzoreese@gmail.com>
PR fortran/82511
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 019b803..c21611c 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -1670,7 +1670,9 @@ gfc_get_symbol_decl (gfc_symbol * sym)
{
/* Catch functions. Only used for actual parameters,
procedure pointers and procptr initialization targets. */
- if (sym->attr.use_assoc || sym->attr.intrinsic
+ if (sym->attr.use_assoc
+ || sym->attr.used_in_submodule
+ || sym->attr.intrinsic
|| sym->attr.if_source != IFSRC_DECL)
{
decl = gfc_get_extern_function_decl (sym);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bfb0197..a43894f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+017-10-18 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/82550
+ * gfortran.dg/submodule_30.f08 : New test.
+
2017-10-18 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.target/s390/zvector/vec-cmp-2.c
diff --git a/gcc/testsuite/gfortran.dg/submodule_30.f08 b/gcc/testsuite/gfortran.dg/submodule_30.f08
new file mode 100644
index 0000000..25dcbeb
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/submodule_30.f08
@@ -0,0 +1,42 @@
+! { dg-do run }
+!
+! Test the fix for PR82550 in which the reference to 'p' in 'foo'
+! was not being correctly handled.
+!
+! Contributed by Reinhold Bader <Bader@lrz.de>
+!
+module m_subm_18_pos
+ implicit none
+ integer :: i = 0
+ interface
+ module subroutine foo(fun_ptr)
+ procedure(p), pointer, intent(out) :: fun_ptr
+ end subroutine
+ end interface
+contains
+ subroutine p()
+ i = 1
+ end subroutine p
+end module m_subm_18_pos
+submodule (m_subm_18_pos) subm_18_pos
+ implicit none
+contains
+ module subroutine foo(fun_ptr)
+ procedure(p), pointer, intent(out) :: fun_ptr
+ fun_ptr => p
+ end subroutine
+end submodule
+program p_18_pos
+ use m_subm_18_pos
+ implicit none
+ procedure(), pointer :: x
+ call foo(x)
+ call x()
+ if (i == 1) then
+ write(*,*) 'OK'
+ else
+ write(*,*) 'FAIL'
+ call abort
+ end if
+end program p_18_pos
+