From: burnus Date: Fri, 4 May 2012 18:54:25 +0000 (+0000) Subject: 2012-05-04 Tobias Burnus X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87d9f56912d46258f12fc173fc3d5aa9923eaa95;p=thirdparty%2Fgcc.git 2012-05-04 Tobias Burnus 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 PR fortran/53175 gfortran.dg/public_private_module_5.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187175 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0965b00bc10e..bb4c22d49bc1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2012-05-04 Tobias Burnus + + 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 PR fortran/53111 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 411ebb5a1c24..e15d6e12d7da 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index d6c090e86062..9196f0a33098 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c3e7db777f01..cb5486c20aa4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-04 Tobias Burnus + + PR fortran/53175 + gfortran.dg/public_private_module_5.f90: New. + 2012-05-04 Tobias Burnus PR fortran/53111 diff --git a/gcc/testsuite/gfortran.dg/public_private_module_5.f90 b/gcc/testsuite/gfortran.dg/public_private_module_5.f90 new file mode 100644 index 000000000000..9c9d15dbd760 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/public_private_module_5.f90 @@ -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" } } +