re PR fortran/53175 (link failure for private module variables used in function specification)

2012-05-04  Tobias Burnus  <burnus@net-b.de>

        PR fortran/53175
        * resolve.c (resolve_variable): Set public_used
        if a private module variable is used in a (public)
        specification expression.
        * trans-decl.c (gfc_finish_var_decl): Mark those
        TREE_PUBLIC.

2012-05-04  Tobias Burnus  <burnus@net-b.de>

        PR fortran/53175
        gfortran.dg/public_private_module_5.f90: New.

From-SVN: r187175
This commit is contained in:
Tobias Burnus 2012-05-04 20:54:25 +02:00 committed by Tobias Burnus
parent 6ba84c3143
commit ed4639a996
5 changed files with 68 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2012-05-04 Tobias Burnus <burnus@net-b.de>
PR fortran/53175
* resolve.c (resolve_variable): Set public_used
if a private module variable is used in a (public)
specification expression.
* trans-decl.c (gfc_finish_var_decl): Mark those
TREE_PUBLIC.
2012-05-04 Tobias Burnus <burnus@net-b.de>
PR fortran/53111

View File

@ -5124,6 +5124,19 @@ resolve_variable (gfc_expr *e)
if (check_assumed_size_reference (sym, e))
return FAILURE;
/* If a PRIVATE variable is used in the specification expression of the
result variable, it might be accessed from outside the module and can
thus not be TREE_PUBLIC() = 0.
TODO: sym->attr.public_used only has to be set for the result variable's
type-parameter expression and not for dummies or automatic variables.
Additionally, it only has to be set if the function is either PUBLIC or
used in a generic interface or TBP; unfortunately,
proc_name->attr.public_used can get set at a later stage. */
if (specification_expr && sym->attr.access == ACCESS_PRIVATE
&& !sym->attr.function && !sym->attr.use_assoc
&& gfc_current_ns->proc_name && gfc_current_ns->proc_name->attr.function)
sym->attr.public_used = 1;
/* Deal with forward references to entries during resolve_code, to
satisfy, at least partially, 12.5.2.5. */
if (gfc_current_ns->entries

View File

@ -565,7 +565,7 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
/* TODO: Don't set sym->module for result or dummy variables. */
gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
/* This is the declaration of a module variable. */
if (sym->attr.access != ACCESS_PRIVATE)
if (sym->attr.access != ACCESS_PRIVATE || sym->attr.public_used)
TREE_PUBLIC (decl) = 1;
TREE_STATIC (decl) = 1;
}

View File

@ -1,3 +1,8 @@
2012-05-04 Tobias Burnus <burnus@net-b.de>
PR fortran/53175
gfortran.dg/public_private_module_5.f90: New.
2012-05-04 Tobias Burnus <burnus@net-b.de>
PR fortran/53111

View File

@ -0,0 +1,40 @@
! { dg-do compile }
! { dg-options "-O3" }
!
! PR fortran/53175
!
MODULE ENERGY_FUNCTION
IMPLICIT NONE
TYPE PARAM
PRIVATE
INTEGER :: WHICH_VECTOR
END TYPE PARAM
INTEGER, PRIVATE :: DIM2
INTEGER, PRIVATE :: DIM5
private :: specific
interface gen
module procedure specific
end interface gen
CONTAINS
FUNCTION ENERGY_FUNCTION_CURRENT_ARGS()
INTEGER, DIMENSION(DIM2) :: ENERGY_FUNCTION_CURRENT_ARGS
END FUNCTION ENERGY_FUNCTION_CURRENT_ARGS
FUNCTION ENERGY_FUNCTION_GET_PARAMS()
TYPE(PARAM), DIMENSION(DIM2) :: ENERGY_FUNCTION_GET_PARAMS
END FUNCTION ENERGY_FUNCTION_GET_PARAMS
function specific()
character(len=dim5) :: specific
end function specific
END MODULE ENERGY_FUNCTION
! { dg-final { scan-assembler "__energy_function_MOD_dim2" } }
! { dg-final { scan-assembler "__energy_function_MOD_dim5" } }