mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 12:41:17 +08:00
re PR fortran/79676 ([submodules] Compilation/linking error when module procedures PRIVATE)
2017-03-18 Paul Thomas <pault@gcc.gnu.org> PR fortran/79676 * module.c (mio_symbol_attribute): Remove reset of the flag 'no_module_procedures'. (check_for_module_procedures): New function. Move declaration of 'no_module_procedures' to above it. (gfc_dump_module): Traverse namespace calling new function. 2017-03-18 Paul Thomas <pault@gcc.gnu.org> PR fortran/79676 * gfortran.dg/submodule_28.f08 : New test. From-SVN: r246256
This commit is contained in:
parent
c7e4107b53
commit
91d2c04ced
@ -1,3 +1,12 @@
|
||||
2017-03-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/79676
|
||||
* module.c (mio_symbol_attribute): Remove reset of the flag
|
||||
'no_module_procedures'.
|
||||
(check_for_module_procedures): New function. Move declaration
|
||||
of 'no_module_procedures' to above it.
|
||||
(gfc_dump_module): Traverse namespace calling new function.
|
||||
|
||||
2017-03-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/71838
|
||||
|
@ -193,10 +193,6 @@ static const char *module_name;
|
||||
/* The name of the .smod file that the submodule will write to. */
|
||||
static const char *submodule_name;
|
||||
|
||||
/* Suppress the output of a .smod file by module, if no module
|
||||
procedures have been seen. */
|
||||
static bool no_module_procedures;
|
||||
|
||||
static gfc_use_list *module_list;
|
||||
|
||||
/* If we're reading an intrinsic module, this is its ID. */
|
||||
@ -2243,10 +2239,7 @@ mio_symbol_attribute (symbol_attribute *attr)
|
||||
if (attr->array_outer_dependency)
|
||||
MIO_NAME (ab_attribute) (AB_ARRAY_OUTER_DEPENDENCY, attr_bits);
|
||||
if (attr->module_procedure)
|
||||
{
|
||||
MIO_NAME (ab_attribute) (AB_MODULE_PROCEDURE, attr_bits);
|
||||
no_module_procedures = false;
|
||||
}
|
||||
if (attr->oacc_declare_create)
|
||||
MIO_NAME (ab_attribute) (AB_OACC_DECLARE_CREATE, attr_bits);
|
||||
if (attr->oacc_declare_copyin)
|
||||
@ -6139,6 +6132,18 @@ dump_module (const char *name, int dump_flag)
|
||||
}
|
||||
|
||||
|
||||
/* Suppress the output of a .smod file by module, if no module
|
||||
procedures have been seen. */
|
||||
static bool no_module_procedures;
|
||||
|
||||
static void
|
||||
check_for_module_procedures (gfc_symbol *sym)
|
||||
{
|
||||
if (sym && sym->attr.module_procedure)
|
||||
no_module_procedures = false;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gfc_dump_module (const char *name, int dump_flag)
|
||||
{
|
||||
@ -6148,6 +6153,8 @@ gfc_dump_module (const char *name, int dump_flag)
|
||||
dump_smod =false;
|
||||
|
||||
no_module_procedures = true;
|
||||
gfc_traverse_ns (gfc_current_ns, check_for_module_procedures);
|
||||
|
||||
dump_module (name, dump_flag);
|
||||
|
||||
if (no_module_procedures || dump_smod)
|
||||
|
@ -1,3 +1,8 @@
|
||||
2017-03-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/79676
|
||||
* gfortran.dg/submodule_28.f08 : New test.
|
||||
|
||||
2017-03-18 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/71838
|
||||
|
52
gcc/testsuite/gfortran.dg/submodule_28.f08
Normal file
52
gcc/testsuite/gfortran.dg/submodule_28.f08
Normal file
@ -0,0 +1,52 @@
|
||||
! { dg-do run }
|
||||
!
|
||||
! Tests the fix for PR79676 in which submod_test was private even to the
|
||||
! submodule 'my_submod'.
|
||||
!
|
||||
! Contributed by Adam Hirst <adam@aphirst.karoo.co.uk>
|
||||
!
|
||||
module my_mod
|
||||
private ! This hid 'submod_test'.
|
||||
interface
|
||||
module subroutine submod_test(x)
|
||||
integer :: x
|
||||
end subroutine
|
||||
end interface
|
||||
integer answer
|
||||
public routine1, print_two, answer
|
||||
contains
|
||||
subroutine routine1(x)
|
||||
integer :: x
|
||||
call submod_test(x)
|
||||
end subroutine
|
||||
subroutine print_two()
|
||||
integer, parameter :: two = 2
|
||||
answer = answer * two
|
||||
end subroutine
|
||||
end module
|
||||
|
||||
module my_mod_2
|
||||
use my_mod
|
||||
contains
|
||||
subroutine circular_dependency()
|
||||
call print_two()
|
||||
end subroutine
|
||||
end module
|
||||
|
||||
submodule (my_mod) my_submod
|
||||
use my_mod_2
|
||||
contains
|
||||
module subroutine submod_test(x)
|
||||
integer :: x
|
||||
answer = x
|
||||
call circular_dependency()
|
||||
end subroutine
|
||||
|
||||
end submodule
|
||||
|
||||
program hello
|
||||
use my_mod
|
||||
implicit none
|
||||
call routine1(2)
|
||||
if (answer .ne. 4) call abort
|
||||
end program
|
Loading…
x
Reference in New Issue
Block a user