diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2015-08-05 12:06:25 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2015-08-05 12:06:25 +0000 |
commit | a56ea54ab05e657c9a140b0e14d6a7e576aa58c2 (patch) | |
tree | c59e00ca13501b665157dd141e5829a813fb5c5c /gcc/fortran/trans-decl.c | |
parent | 8282c8776d3727948daa41fa340f6b16d4f563d4 (diff) | |
download | gcc-a56ea54ab05e657c9a140b0e14d6a7e576aa58c2.zip gcc-a56ea54ab05e657c9a140b0e14d6a7e576aa58c2.tar.gz gcc-a56ea54ab05e657c9a140b0e14d6a7e576aa58c2.tar.bz2 |
re PR fortran/52846 ([F2008] Support submodules)
2015-08-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/52846
* module.c (check_access): Return true if new static flag
'dump_smod' is true..
(gfc_dump_module): Rename original 'dump_module' and call from
new version. Use 'dump_smod' rather than the stack state to
determine if a submodule is being processed. The new version of
this procedure sets 'dump_smod' depending on the stack state and
then writes both the mod and smod files if a module is being
processed or just the smod for a submodule.
(gfc_use_module): Eliminate the check for module_name and
submodule_name being the same.
* trans-decl.c (gfc_finish_var_decl, gfc_build_qualified_array,
get_proc_pointer_decl): Set TREE_PUBLIC unconditionally and use
the conditions to set DECL_VISIBILITY as hidden and to set as
true DECL_VISIBILITY_SPECIFIED.
2015-08-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/52846
* lib/fortran-modules.exp: Call cleanup-submodules from
cleanup-modules.
* gfortran.dg/public_private_module_2.f90: Add two XFAILS to
cover the cases where private entities are no longer optimized
away.
* gfortran.dg/public_private_module_6.f90: Add an XFAIL for the
same reason.
* gfortran.dg/submodule_1.f08: Change cleanup module names.
* gfortran.dg/submodule_5.f08: The same.
* gfortran.dg/submodule_9.f08: The same.
* gfortran.dg/submodule_10.f08: New test
From-SVN: r226622
Diffstat (limited to 'gcc/fortran/trans-decl.c')
-rw-r--r-- | gcc/fortran/trans-decl.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index f95ca16..269c235 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -596,6 +596,11 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) both, of course.) (J3/04-007, section 15.3). */ TREE_PUBLIC(decl) = 1; DECL_COMMON(decl) = 1; + if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used) + { + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; + DECL_VISIBILITY_SPECIFIED (decl) = true; + } } /* If a variable is USE associated, it's always external. */ @@ -609,9 +614,13 @@ 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); - if (sym->attr.access != ACCESS_PRIVATE || sym->attr.public_used) - TREE_PUBLIC (decl) = 1; + TREE_PUBLIC (decl) = 1; TREE_STATIC (decl) = 1; + if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used) + { + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; + DECL_VISIBILITY_SPECIFIED (decl) = true; + } } /* Derived types are a bit peculiar because of the possibility of @@ -837,9 +846,13 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym) else TREE_STATIC (token) = 1; - if (sym->attr.use_assoc || sym->attr.access != ACCESS_PRIVATE || - sym->attr.public_used) - TREE_PUBLIC (token) = 1; + TREE_PUBLIC (token) = 1; + + if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used) + { + DECL_VISIBILITY (token) = VISIBILITY_HIDDEN; + DECL_VISIBILITY_SPECIFIED (token) = true; + } } else { @@ -1747,9 +1760,12 @@ get_proc_pointer_decl (gfc_symbol *sym) else if (sym->module && sym->ns->proc_name->attr.flavor == FL_MODULE) { /* This is the declaration of a module variable. */ - if (sym->ns->proc_name->attr.flavor == FL_MODULE - && (sym->attr.access != ACCESS_PRIVATE || sym->attr.public_used)) - TREE_PUBLIC (decl) = 1; + TREE_PUBLIC (decl) = 1; + if (sym->attr.access == ACCESS_PRIVATE && !sym->attr.public_used) + { + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; + DECL_VISIBILITY_SPECIFIED (decl) = true; + } TREE_STATIC (decl) = 1; } |