Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] Support C1553 about BIND(C) function result
As Fortran 2018 C1553, if with BIND(C), the function result shall be an interoperable scalar variable. As Fortran 2018 18.3.4(1), the interoperable scalar variable is not a coarray, has neither the ALLOCATABLE nor the POINTER attribute, and if it is of type character its length is not assumed or declared by an expression that is not a constant expression. As Fortran 2018 18.3.1(1), if the type is character, the length type parameter is interoperable if and only if its value is one. Reviewed By: PeteSteinfeld, jeanPerier Differential Revision: https://reviews.llvm.org/D137254
- Loading branch information
1 parent
800f0f1
commit 2d6e280
Showing
2 changed files
with
80 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
! RUN: %python %S/test_errors.py %s %flang_fc1 | ||
! Check for C1553 and 18.3.4(1) | ||
|
||
function func1() result(res) bind(c) | ||
! ERROR: BIND(C) function result cannot have ALLOCATABLE or POINTER attribute | ||
integer, pointer :: res | ||
end | ||
|
||
function func2() result(res) bind(c) | ||
! ERROR: BIND(C) function result cannot have ALLOCATABLE or POINTER attribute | ||
integer, allocatable :: res | ||
end | ||
|
||
function func3() result(res) bind(c) | ||
! ERROR: BIND(C) function result must be scalar | ||
integer :: res(2) | ||
end | ||
|
||
function func4() result(res) bind(c) | ||
! ERROR: BIND(C) character function result must have length one | ||
character(*) :: res | ||
end | ||
|
||
function func5(n) result(res) bind(c) | ||
integer :: n | ||
! ERROR: BIND(C) character function result must have length one | ||
character(n) :: res | ||
end | ||
|
||
function func6() result(res) bind(c) | ||
! ERROR: BIND(C) character function result must have length one | ||
character(2) :: res | ||
end | ||
|
||
function func7() result(res) bind(c) | ||
integer, parameter :: n = 1 | ||
character(n) :: res ! OK | ||
end | ||
|
||
function func8() result(res) bind(c) | ||
! ERROR: BIND(C) function result cannot have ALLOCATABLE or POINTER attribute | ||
! ERROR: BIND(C) character function result must have length one | ||
character(:), pointer :: res | ||
end | ||
|
||
function func9() result(res) bind(c) | ||
! ERROR: BIND(C) function result cannot be a coarray | ||
integer :: res[10, *] | ||
end |