From ee077fcb8cdb4b4b54e4e7363eec401607c08c2c Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Wed, 18 Oct 2017 08:55:27 +0000 Subject: [PATCH] re PR fortran/82550 (program using submodules fails to link) 2017-10-18 Paul Thomas 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-18 Paul Thomas PR fortran/82550 * gfortran.dg/submodule_30.f08 : New test. From-SVN: r253848 --- gcc/fortran/ChangeLog | 7 ++++ gcc/fortran/trans-decl.c | 4 ++- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gfortran.dg/submodule_30.f08 | 42 ++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/submodule_30.f08 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 02763fe580b..ab266509879 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2017-10-18 Paul Thomas + + 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 PR fortran/82511 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 019b8035b6f..c21611c5d6c 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 bfb01971421..a43894f2ad6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +017-10-18 Paul Thomas + + PR fortran/82550 + * gfortran.dg/submodule_30.f08 : New test. + 2017-10-18 Andreas Krebbel * 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 00000000000..25dcbebe656 --- /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 +! +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 + -- 2.30.2