Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] Fix for flang-compiler/f18#694 - Unexpected error when compil…
…ing submodule Incorporated all review comments and updated the test case. Change-Id: I03939bfc705cc5319a0b7da3305026b8403b8edc Original-commit: flang-compiler/f18@010da42 Reviewed-on: flang-compiler/f18#817 Tree-same-pre-rewrite: false
- Loading branch information
kiranktp
committed
Nov 14, 2019
1 parent
c1ca1b2
commit deffc7a
Showing
3 changed files
with
118 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
!===-- separate-module-procs-2.f90 - Test separate module procedure ---------=== | ||
! | ||
! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
! See https://llvm.org/LICENSE.txt for license information. | ||
! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
! | ||
!===-------------------------------------------------------------------------=== | ||
|
||
! case 1: ma_create_new_fun' was not declared a separate module procedure | ||
module m1 | ||
integer :: i | ||
interface ma | ||
module function ma_create_fun( ) result(this) | ||
integer this | ||
end function | ||
end interface | ||
end module | ||
|
||
submodule (m1) ma_submodule | ||
integer :: j | ||
contains | ||
module function ma_create_fun() result(this) | ||
integer this | ||
i = 1 | ||
j = 2 | ||
end function | ||
|
||
!ERROR: 'ma_create_new_fun' was not declared a separate module procedure | ||
module function ma_create_new_fun() result(this) | ||
integer :: this | ||
i = 2 | ||
j = 1 | ||
print *, "Hello" | ||
end function | ||
end submodule | ||
|
||
! case 2: 'mb_create_new_sub' was not declared a separate module procedure | ||
module m2 | ||
integer :: i | ||
interface mb | ||
module subroutine mb_create_sub | ||
end subroutine mb_create_sub | ||
end interface | ||
end module | ||
|
||
submodule (m2) mb_submodule | ||
integer :: j | ||
contains | ||
module subroutine mb_create_sub | ||
integer this | ||
i = 1 | ||
j = 2 | ||
end subroutine mb_create_sub | ||
|
||
!ERROR: 'mb_create_new_sub' was not declared a separate module procedure | ||
module SUBROUTINE mb_create_new_sub() | ||
integer :: this | ||
i = 2 | ||
j = 1 | ||
end SUBROUTINE mb_create_new_sub | ||
end submodule | ||
|
||
! case 3: separate module procedure without module prefix | ||
module m3 | ||
interface mc | ||
function mc_create( ) result(this) | ||
integer :: this | ||
end function | ||
end interface | ||
end module | ||
|
||
submodule (m3) mc_submodule | ||
contains | ||
!ERROR: 'mc_create' was not declared a separate module procedure | ||
module function mc_create() result(this) | ||
integer :: this | ||
end function | ||
end submodule | ||
|
||
! case 4: Submodule having separate module procedure rather than a module | ||
module m4 | ||
interface | ||
real module function func1() ! module procedure interface body for func1 | ||
end function | ||
end interface | ||
end module | ||
|
||
submodule (m4) m4sub | ||
interface | ||
module function func2(b) ! module procedure interface body for func2 | ||
integer :: b | ||
integer :: func2 | ||
end function | ||
|
||
real module function func3() ! module procedure interface body for func3 | ||
end function | ||
end interface | ||
contains | ||
real module function func1() ! implementation of func1 declared in m4 | ||
func1 = 20 | ||
end function | ||
end submodule | ||
|
||
submodule (m4:m4sub) m4sub2 | ||
contains | ||
module function func2(b) ! implementation of func2 declared in m4sub | ||
integer :: b | ||
integer :: func2 | ||
func2 = b | ||
end function | ||
|
||
real module function func3() ! implementation of func3 declared in m4sub | ||
func3 = 20 | ||
end function | ||
end submodule |