2010-01-13 Tobias Burnus <burnus@net-b.de>
PR fortran/47266
* trans-decl.c (build_function_decl): Don't mark private
module procedures as TREE_PUBLIC.
2010-01-13 Tobias Burnus <burnus@net-b.de>
PR fortran/47266
* gfortran.dg/module_private_2.f90: New.
@@ -1664,7 +1664,8 @@ build_function_decl (gfc_symbol * sym, bool global)
DECL_EXTERNAL (fndecl) = 0;
if (!current_function_decl
- && !sym->attr.entry_master && !sym->attr.is_main_program)
+ && !sym->attr.entry_master && !sym->attr.is_main_program
+ && (sym->attr.access != ACCESS_PRIVATE || sym->binding_label[0] != '\0'))
TREE_PUBLIC (fndecl) = 1;
attributes = add_attributes_to_decl (attr, NULL_TREE);
@@ -0,0 +1,36 @@
+! { dg-do compile }
+! { dg-options "-O2 -fdump-tree-optimized" }
+!
+! PR fortran/47266
+!
+! Check whether the private procedure "priv" is optimized away
+!
+module m
+ implicit none
+ private :: priv
+ private :: export1, export2
+ public :: pub
+contains
+ integer function priv()
+ priv = 44
+ end function priv
+ integer function export1()
+ export1 = 45
+ end function export1
+ function export2() bind(C) ! { dg-warning "is marked PRIVATE" }
+ use iso_c_binding, only: c_int
+ integer(c_int) :: export2
+ export2 = 46
+ end function export2
+ subroutine pub(a,b)
+ integer :: a
+ procedure(export1), pointer :: b
+ a = priv()
+ b => export1
+ end subroutine pub
+end module m
+! { dg-final { scan-tree-dump-times "priv" 0 "optimized" } }
+! { dg-final { scan-tree-dump-times "export1 \\(\\)" 1 "optimized" } }
+! { dg-final { scan-tree-dump-times "export2 \\(\\)" 1 "optimized" } }
+! { dg-final { cleanup-tree-dump "optimized" } }
+! { dg-final { cleanup-modules "m" } }