mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
6ba84c3143
commit
ed4639a996
|
@ -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>
|
2012-05-04 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
PR fortran/53111
|
PR fortran/53111
|
||||||
|
|
|
@ -5124,6 +5124,19 @@ resolve_variable (gfc_expr *e)
|
||||||
if (check_assumed_size_reference (sym, e))
|
if (check_assumed_size_reference (sym, e))
|
||||||
return FAILURE;
|
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
|
/* Deal with forward references to entries during resolve_code, to
|
||||||
satisfy, at least partially, 12.5.2.5. */
|
satisfy, at least partially, 12.5.2.5. */
|
||||||
if (gfc_current_ns->entries
|
if (gfc_current_ns->entries
|
||||||
|
|
|
@ -565,7 +565,7 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
|
||||||
/* TODO: Don't set sym->module for result or dummy variables. */
|
/* TODO: Don't set sym->module for result or dummy variables. */
|
||||||
gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
|
gcc_assert (current_function_decl == NULL_TREE || sym->result == sym);
|
||||||
/* This is the declaration of a module variable. */
|
/* 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_PUBLIC (decl) = 1;
|
||||||
TREE_STATIC (decl) = 1;
|
TREE_STATIC (decl) = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
2012-05-04 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
PR fortran/53111
|
PR fortran/53111
|
||||||
|
|
|
@ -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" } }
|
||||||
|
|
Loading…
Reference in New Issue