diff options
author | Vitaly Mogulian <vitaly.mogulian@gmail.com> | 2022-07-30 17:07:14 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-08-09 13:11:30 (GMT) |
commit | 219a9b1e14084d16284c909ea055b3329750c909 (patch) | |
tree | 648c9bad4b00b5cc2869220f26e74641970221a1 /Tests | |
parent | a7211d6a2fd3097f88af94633b584d8ff76a8bce (diff) | |
download | CMake-219a9b1e14084d16284c909ea055b3329750c909.zip CMake-219a9b1e14084d16284c909ea055b3329750c909.tar.gz CMake-219a9b1e14084d16284c909ea055b3329750c909.tar.bz2 |
Fortran: Fix suprious dependencies with submodules
In commit 695f0d0d3a (cmFortranParser: Parse keywords as lexical tokens,
2016-09-05, v3.7.0-rc1~150^2) we created keyword-specific variants of
the original `USE WORD other EOSTMT` production, such as
`MODULE WORD other EOSTMT` and `INTERFACE WORD other EOSTMT`. The same
pattern was used by more keyword-specific productions in commit b5ac8b8aa7
(Fortran: Add support for submodule syntax in dependency scanning,
2016-09-05, v3.7.0-rc1~73^2~1).
The postfix part (`other`) of several keyword-specific productions is
not needed to match Fortran syntax. See the Fortran 2018 standard,
para.4.1.4/1 on p.28, para.14.2.1/2 on pp.293-294. The postfix is
needed only for a case of operator 'use':
use <module-name> [, only : <list-of-vars>]
The unnecessary postfix matching from the keyword-specific productions
such as module, submodule, and interface declarations can cause spurious
module dependencies to be detected, so remove it.
Extend the test suite with examples covering the previously-broken
cases.
Fixes: #18427
Diffstat (limited to 'Tests')
-rw-r--r-- | Tests/FortranModules/Submodules/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Tests/FortranModules/Submodules/main.f90 | 7 | ||||
-rw-r--r-- | Tests/FortranModules/Submodules/obfuscated_parent.f90 | 33 | ||||
-rw-r--r-- | Tests/FortranModules/test_module_main.f90 | 2 |
4 files changed, 40 insertions, 3 deletions
diff --git a/Tests/FortranModules/Submodules/CMakeLists.txt b/Tests/FortranModules/Submodules/CMakeLists.txt index ab8e0f9..783af7e 100644 --- a/Tests/FortranModules/Submodules/CMakeLists.txt +++ b/Tests/FortranModules/Submodules/CMakeLists.txt @@ -16,6 +16,7 @@ add_executable(submod main.f90 parent.f90 + obfuscated_parent.f90 child.f90 grandchild.f90 greatgrandchild.f90 diff --git a/Tests/FortranModules/Submodules/main.f90 b/Tests/FortranModules/Submodules/main.f90 index 3cd2989..67ffba8 100644 --- a/Tests/FortranModules/Submodules/main.f90 +++ b/Tests/FortranModules/Submodules/main.f90 @@ -1,7 +1,10 @@ program main use parent, only : child_function,grandchild_subroutine use parent, only : sibling_function,GreatGrandChild_subroutine + ! Using a module without postfix + use obfuscated_parent implicit none - if (child_function()) call grandchild_subroutine - if (sibling_function()) call GreatGrandChild_subroutine + if (child_function()) call grandchild_subroutine + if (sibling_function()) call GreatGrandChild_subroutine + if (child_function_obf()) call grandchild_subroutine_obf end program diff --git a/Tests/FortranModules/Submodules/obfuscated_parent.f90 b/Tests/FortranModules/Submodules/obfuscated_parent.f90 new file mode 100644 index 0000000..f3e68be --- /dev/null +++ b/Tests/FortranModules/Submodules/obfuscated_parent.f90 @@ -0,0 +1,33 @@ +! This module has two procedures from the "parent" module +! but it has different combinations 'module <word>' phrases +! in breaked lines for test of modules dependencies detection + +! Module declaration on breaked line with reminder +module & + obfuscated_parent; implicit none + + interface + + ! Boolean module function + module logical & + function child_function_obf() result(child_stuff) + end function + + ! Module subroutine + module subroutine & + grandchild_subroutine_obf() + end subroutine + + end interface + + contains + + module logical function child_function_obf() result(child_stuff) + child_stuff=.true. + end function + + module subroutine grandchild_subroutine_obf() + print *,"Test passed." + end subroutine + +end module obfuscated_parent diff --git a/Tests/FortranModules/test_module_main.f90 b/Tests/FortranModules/test_module_main.f90 index 6ac97fa..958d0a2 100644 --- a/Tests/FortranModules/test_module_main.f90 +++ b/Tests/FortranModules/test_module_main.f90 @@ -1,4 +1,4 @@ PROGRAM MAINF90 - USE TEST_MODULE + USE TEST_MODULE, only : TEST_MODULE_FUNCTION PRINT *,'Sum is',TEST_MODULE_FUNCTION(1., 2.) END PROGRAM MAINF90 |