- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Dear Fortran Forum,
i got a problem with the ifort 18 Update 1 Compiler. It seems the way the alias attribute is handled in submodules has changed. I can't get my code to compile with the alias attribute. I need it, to keep downward compatibility of the dll. Is this new behavior intended or a bug?
Greetings
Wolf
module M_MOD implicit none type T_TYPE contains ! procedure, nopass :: foo ! This works without ALIAS procedure, nopass :: foo_renamed=>foo ! This works in none of my tests with 18.1 end type interface module subroutine foo() ! !DEC$ ATTRIBUTES ALIAS:"foo" :: foo !DEC$ ATTRIBUTES DLLEXPORT :: foo end subroutine end interface end module submodule (M_MOD) S_MOD implicit none contains module subroutine foo() ! IFORT 16 to 18.0 give "error #7286: This symbol has multiply declared DEC$ ATTRIBUTES ALIAS attribute. [FOO]" ! !DEC$ ATTRIBUTES ALIAS:"foo" :: foo ! Until 18.1 it worked without this line !DEC$ ATTRIBUTES DLLEXPORT :: foo end subroutine end submodule module M_USING_M_MOD use M_MOD implicit none contains subroutine bar() type(T_TYPE) :: T_TYPE_INSTANCE ! IFORT 18.1 gives Link error: "error LNK2019: unresolved external symbol "M_MOD_mp_FOO" in function "M_USING_M_MOD_mp_BAR"" ! call T_TYPE_INSTANCE%foo() ! IFORT 18.1 gives Link error: "error LNK2019: unresolved external symbol "M_MOD_mp_FOO_RENAMED" in function "M_USING_M_MOD_mp_BAR"" call T_TYPE_INSTANCE%foo_renamed() end subroutine end module
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm sorry, I can't understand what you want to happen.
What I think you want, is for submodule routine named "foo" to have the external name "foo" (rather than the fully qualified module name).
What I can't easily work out, is which commented out code paths are good, which are problematic.
We did fix an issue with the multiple ALIAS declarations, so yes, there have been changes in this area.
Can you post a version that worked in 18.0 but does not work in 18.1? Maybe that would be clearer for me.
thanks --
--Lorri
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm sorry, that i couldn't make things clear...
Yes i want "foo" to have the external name foo - i can work around this problem in most of my code, but i think this is a compiler bug. The ALIAS seems to be broken, when used with type bound procedures in submodules.
I just realized, that it fails without the renaming, too.
!This works in <=18.0 module M_MOD implicit none type T_TYPE contains procedure, nopass :: foo end type interface module subroutine foo() !DEC$ ATTRIBUTES ALIAS:"foo" :: foo !DEC$ ATTRIBUTES DLLEXPORT :: foo end subroutine end interface end module submodule (M_MOD) S_MOD implicit none contains module subroutine foo() !DEC$ ATTRIBUTES DLLEXPORT :: foo end subroutine end submodule module M_USING_M_MOD use M_MOD implicit none contains subroutine bar() type(T_TYPE) :: T_TYPE_INSTANCE call T_TYPE_INSTANCE%foo() end subroutine end module
-----
module M_MOD implicit none type T_TYPE contains procedure, nopass :: foo end type interface module subroutine foo() !DEC$ ATTRIBUTES ALIAS:"foo" :: foo !DEC$ ATTRIBUTES DLLEXPORT :: foo end subroutine end interface end module submodule (M_MOD) S_MOD implicit none contains module subroutine foo() !DEC$ ATTRIBUTES ALIAS:"foo" :: foo !DEC$ ATTRIBUTES DLLEXPORT :: foo end subroutine end submodule module M_USING_M_MOD use M_MOD implicit none contains subroutine bar() type(T_TYPE) :: T_TYPE_INSTANCE ! call foo() ! But it works, when not calling the type bound procedure call T_TYPE_INSTANCE%foo() end subroutine end module
Greetings
Wolf
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
As a matter of interest does bind(c, name='foo') work as that is surely better than using the not standard "alias"?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The difference with BIND(C,NAME=) is that it behaves as if you had added DECORATE to the ALIAS attribute, so with 32-bit you get a leading underscore.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page