aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gfortran.dg/submodule_8.f0844
-rw-r--r--gcc/testsuite/gfortran.dg/submodule_9.f0840
2 files changed, 84 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/submodule_8.f08 b/gcc/testsuite/gfortran.dg/submodule_8.f08
new file mode 100644
index 0000000..15a38a5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/submodule_8.f08
@@ -0,0 +1,44 @@
+! { dg-do run }
+!
+! Checks that F2008:11.2.3 para 2 is correctly implemented so that
+! no error results from using 'mod_s' for both a module name and
+! a submodule name. The submodule is now identified as 'mod_a.mod_s'
+! internally and the submodule file as 'mod_a@mod_s.smod'.
+!
+! Contributed by Reinhold Bader <reinhold.bader@lrz.de>
+!
+module mod_a
+ implicit none
+ interface
+ module subroutine p()
+ end subroutine
+ end interface
+end module
+
+submodule (mod_a) mod_s
+ implicit none
+ integer :: i=-2
+contains
+ module procedure p
+ if (i .ne. -2) then
+ call abort
+ end if
+ end procedure
+end submodule
+
+module mod_s
+ use mod_a
+ implicit none
+ integer :: i=2
+end module
+
+program a_s
+ use mod_s
+ implicit none
+ if (i==2) then
+ call p()
+ else
+ call abort
+ end if
+end program
+! { dg-final { cleanup-submodules "mod_a@mod_s" } }
diff --git a/gcc/testsuite/gfortran.dg/submodule_9.f08 b/gcc/testsuite/gfortran.dg/submodule_9.f08
new file mode 100644
index 0000000..4589ebc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/submodule_9.f08
@@ -0,0 +1,40 @@
+! { dg-do compile }
+!
+! Checks that the name clash between the two submodules 'mod_s' is an error.
+!
+! Contributed by Reinhold Bader <reinhold.bader@lrz.de>
+!
+module mod_a
+ implicit none
+ interface
+ module subroutine p()
+ end subroutine
+ end interface
+end module
+
+submodule (mod_a) mod_s ! { dg-error "already being used as a MODULE" }
+end submodule
+
+submodule (mod_a:mod_s) b
+end submodule
+
+submodule (mod_a:b) mod_s ! { dg-error "already being used as a MODULE" }
+ implicit none
+ integer :: i=-2
+contains
+ module procedure p
+ write(*,*) 'FAIL'
+ end procedure
+end submodule
+
+module mod_s
+ use mod_a
+ implicit none
+ integer :: i=2
+end module
+
+program a_s
+ use mod_s
+ implicit none
+ call p()
+end program