From 8ededf6bd1e39fcad6e440986ed45eedcd7164a3 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sat, 29 Dec 2018 18:21:39 +0000 Subject: [PATCH] re PR fortran/82550 (program using submodules fails to link) 2018-12-29 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'. 2018-12-29 Paul Thomas PR fortran/82550 * gfortran.dg/submodule_30.f08 : New test. From-SVN: r267466 --- gcc/fortran/ChangeLog | 8 +++++ gcc/fortran/trans-decl.c | 4 ++- gcc/testsuite/ChangeLog | 10 ++++-- gcc/testsuite/gfortran.dg/submodule_30.f08 | 42 ++++++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/submodule_30.f08 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 40d64bd4cc15..e12b57709616 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-12-29 Paul Thomas + + Backport from trunk + 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'. + 2018-12-23 Paul Thomas Backport from trunk diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 1e2be2f2d0eb..f0a2e03ecf25 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1655,7 +1655,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 81f74eb2645b..a366259c3e08 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-12-29 Paul Thomas + + Backport from trunk + PR fortran/82550 + * gfortran.dg/submodule_30.f08 : New test. + 2018-12-24 Iain Sandoe Backport from mainline @@ -10,7 +16,7 @@ Backport from mainline 2018-08-16 Iain Sandoe - + * g++.dg/torture/pr44295.C : Skip for Darwin. 2018-12-24 Iain Sandoe @@ -23,7 +29,7 @@ (test_noreturn): Likewise. 2018-08-16 Iain Sandoe - + * gcc.dg/memcmp-1.c (lib_memcmp): Apply __USER_LABEL_PREFIX__. (lib_strncmp): Likewise. diff --git a/gcc/testsuite/gfortran.dg/submodule_30.f08 b/gcc/testsuite/gfortran.dg/submodule_30.f08 new file mode 100644 index 000000000000..7d59bab5271e --- /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' + STOP 1 + end if +end program p_18_pos + -- 2.47.2