- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here's an example of my library that uses `submodule` and `module procedure` functionality, it compiles on `gfortran`, but `ifort/ifx` reports an error, which should be a bug:
module math
interface cross_product
pure module function cross_product_real_kind(v1, v2)
real(kind=4), intent(in) :: v1(3)
real(kind=4), intent(in) :: v2(3)
real(kind=4) :: cross_product_real_kind(3)
end function cross_product_real_kind
end interface
end module math
submodule(math) math_cross_product
contains
module procedure cross_product_real_kind
cross_product_real_kind(1) = v1(2)*v2(3) - v1(3)*v2(2)
cross_product_real_kind(2) = v1(3)*v2(1) - v1(1)*v2(3)
cross_product_real_kind(3) = v1(1)*v2(2) - v1(2)*v2(1)
end procedure cross_product_real_kind
end submodule math_cross_product
> ifort -c math.f90 -o math.f90.o
math.f90(13): error #6072: A dummy argument of a statement function must be a scalar identifier. [1]
cross_product_real_kind(1) = v1(2)*v2(3) - v1(3)*v2(2)
--------------------------------^
math.f90(14): error #6432: This statement function has been defined more than once. [CROSS_PRODUCT_REAL_KIND]
cross_product_real_kind(2) = v1(3)*v2(1) - v1(1)*v2(3)
--------^
math.f90(14): error #6072: A dummy argument of a statement function must be a scalar identifier. [2]
cross_product_real_kind(2) = v1(3)*v2(1) - v1(1)*v2(3)
--------------------------------^
math.f90(15): error #6072: A dummy argument of a statement function must be a scalar identifier. [3]
cross_product_real_kind(3) = v1(1)*v2(2) - v1(2)*v2(1)
--------------------------------^
math.f90: warning #6178: The return value of this FUNCTION has not been defined. [CROSS_PRODUCT_REAL_KIND]
math.f90(13): remark #7713: This statement function has not been used. [CROSS_PRODUCT_REAL_KIND]
cross_product_real_kind(1) = v1(2)*v2(3) - v1(3)*v2(2)
--------^
compilation aborted for math.f90 (code 1)
> ifort -v
ifort version 2021.9.0
> ifx -v
ifx version 2023.1.0
When I use the custom `ans` as the return value, everything works:
module math
interface cross_product
pure module function cross_product_real_kind(v1, v2) result(ans)
real(kind=4), intent(in) :: v1(3)
real(kind=4), intent(in) :: v2(3)
real(kind=4) :: ans(3)
end function cross_product_real_kind
end interface
end module math
submodule(math) math_cross_product
contains
module procedure cross_product_real_kind
ans(1) = v1(2)*v2(3) - v1(3)*v2(2)
ans(2) = v1(3)*v2(1) - v1(1)*v2(3)
ans(3) = v1(1)*v2(2) - v1(2)*v2(1)
end procedure cross_product_real_kind
end submodule math_cross_product
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for reporting this issue. I filed a bug, CMPLRLLVM-46801. I'll post when it's fixed.
It's good you have a simple workaround!
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page