http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47266

           Summary: Optimization: Declare PRIVATE module procedures as
                    "TREE_PUBLIC = 0" ("static function")
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: bur...@gcc.gnu.org


Found when thinking about PR 47260.

PRIVATE module procedures are by construction not accessible outside the
translation unit. Well, one can then simply mark them as "static" (in the C
sense) by not setting TREE_PUBLIC to 1.

For procedures one currently calls gfc_create_function_decl,
which calls build_function_decl. That function contains:
  if (!current_function_decl
      && !sym->attr.entry_master && !sym->attr.is_main_program)
    TREE_PUBLIC (fndecl) = 1;

Thus, adding "&& !sym->attr.access == ACCESS_PRIVATE" should be sufficient.


Test case
- Expected: With "-O2 -c", "nm" only prints "__m_MOD_pub"
- Current result, "nm" shows:
  000000000000001e T __m_MOD_priv
  0000000000000000 T __m_MOD_pub

module m
  implicit none
  private :: priv
  public  :: pub
contains
  integer function priv()
    priv = 44
  end function priv
  subroutine pub(a)
    integer :: a
    a = priv()
  end subroutine pub
end module m

Reply via email to