# Inter-submodule procedure calling

**URL:** <https://fortran-lang.discourse.group/t/inter-submodule-procedure-calling/9656>\
**Category:** Help\
**Created:** [May 1, 2025, 4:03pm UTC](https://fortran-lang.discourse.group/t/inter-submodule-procedure-calling/9656 "2025-05-01T16:03:42Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![icpup](https://avatars.discourse-cdn.com/v4/letter/i/e79b87/32.png) [@icpup](https://fortran-lang.discourse.group/u/icpup)\
**Post date:** [May 1, 2025, 4:03pm UTC](https://fortran-lang.discourse.group/t/inter-submodule-procedure-calling/9656/1 "2025-05-01T16:03:42Z")

</div>

A parent module and its submodules are in their own files as shown below. Can submodule B call procedure defined in submodule A through use association?

(File) module parent  
|  
|—(File) submodule A  
| public module procedure childA  
|  
|—(File) submodule B  
use submodule A ? or use parent:submodule A  
call childA

---

<div class="post-metadata">

**Author:** ![jeff.irwin](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/jeff.irwin/32/3673_2.png) [@jeff.irwin](https://fortran-lang.discourse.group/u/jeff.irwin)\
**Post date:** [May 2, 2025, 11:11pm UTC](https://fortran-lang.discourse.group/t/inter-submodule-procedure-calling/9656/2 "2025-05-02T23:11:25Z")

</div>

They can call each other with two changes:

1. Interfaces for the child procedures must be defined in the parent module
2. There is no need for `use`, because all children belong to the same parent module

Here’s a complete example:

main.f90:

```fortran
module parent
	implicit none
	interface
		module subroutine subroutine_a()
		end subroutine subroutine_a
		module subroutine subroutine_b()
		end subroutine subroutine_b
	end interface
end module parent

program main
	use parent
	implicit none
	call subroutine_b()
end program main

```

a.f90:

```fortran
submodule(parent) a
	implicit none
	contains
		module subroutine subroutine_a
			print *, "hello from subroutine_a"
		end subroutine subroutine_a
end submodule a

```

b.f90:

```fortran
submodule(parent) b
	implicit none
	contains
		module subroutine subroutine_b
			print *, "hello from subroutine_b"
			call subroutine_a()
		end subroutine subroutine_b
end submodule b

```

---

<div class="post-metadata">

**Author:** ![icpup](https://avatars.discourse-cdn.com/v4/letter/i/e79b87/32.png) [@icpup](https://fortran-lang.discourse.group/u/icpup)\
**Post date:** [May 3, 2025, 2:02am UTC](https://fortran-lang.discourse.group/t/inter-submodule-procedure-calling/9656/3 "2025-05-03T02:02:38Z")

</div>

If procedure childA is in parent module, it will be visible to all submodules, which is not desirable.

---

<div class="post-metadata">

**Author:** ![jwmwalrus](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/jwmwalrus/32/4483_2.png) [@jwmwalrus](https://fortran-lang.discourse.group/u/jwmwalrus)\
**Post date:** [May 3, 2025, 2:48pm UTC](https://fortran-lang.discourse.group/t/inter-submodule-procedure-calling/9656/4 "2025-05-03T14:48:36Z")

</div>

Fortran’s submodule siblings are unaware of each other’s existence. But you can extend the submodule hierarchy as much as you want:

```fortran
module mod1
    implicit none
    ...
end module mod1

submodule (mod1) sm_impl1
    implicit none
    interface
        module subroutine sub1() ! visible to descendants of sm_impl1 but not to mod1
        end subroutine
    end interface
end submodule sm_impl1

submodule (mod1:sm_impl1) sm_impl2
    implicit none
contains
    subroutine do_something()
        call sub1()
    end subroutine
end submodule sm_impl2

submodule (mod1:sm_impl1) sm_impl3
    implicit none
contains
    subroutine do_something()
        call sub1()
    end subroutine
end submodule sm_impl3

```

Notice that `do_something` is defined in both `sm_impl2` and `sm_impl3`, since they’re siblings and are therefore unaware of what the other submodule declares.
