diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2017-10-18 08:55:27 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2017-10-18 08:55:27 +0000 |
commit | ee077fcb8cdb4b4b54e4e7363eec401607c08c2c (patch) | |
tree | fd3c94ed0ddeea9c01879839f77bc413085d7183 | |
parent | 04612f7f8452021ad4eba08f03bc98b196753330 (diff) | |
download | gcc-ee077fcb8cdb4b4b54e4e7363eec401607c08c2c.zip gcc-ee077fcb8cdb4b4b54e4e7363eec401607c08c2c.tar.gz gcc-ee077fcb8cdb4b4b54e4e7363eec401607c08c2c.tar.bz2 |
re PR fortran/82550 (program using submodules fails to link)
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-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/82550
* gfortran.dg/submodule_30.f08 : New test.
From-SVN: r253848
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/submodule_30.f08 | 42 |
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 + |