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



Tobias Burnus <burnus at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

             Status|RESOLVED                    |REOPENED

   Last reconfirmed|                            |2012-12-19

         Resolution|FIXED                       |

     Ever Confirmed|0                           |1



--- Comment #9 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-12-19 
18:20:10 UTC ---

First: I think one should add a pass to frontend-passes.c, similar to 

doloop_code. The reason is that resolve comes too early for some checks.

Quoting from resolve.c:



  /* 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.  */





Secondly, a reducted test case for the FoX issue of comment 7 is the following:



module m

  private

  public :: foo

  interface foo

    module procedure bar

  end interface foo

contains

  pure function mylen()

    integer :: mylen

    mylen = 42

  end function mylen

  subroutine bar(x)

    character(len=mylen()) :: x

  end subroutine bar

end module m





The following line in resolve.c's resolve_function should take care of setting

the public_use attribute, but it doesn't work:



3128      if (sym && specification_expr && sym->attr.function

3129          && gfc_current_ns->proc_name

3130          && gfc_current_ns->proc_name->attr.flavor == FL_MODULE)

3131        sym->attr.public_used = 1;



The reason is that



(gdb) p gfc_current_ns->proc_name->name

$6 = 0x7ffff6725fe0 "bar"

Reply via email to