! RUN: bbc -emit-hlfir %s -o - | %python %S/gen_mod_ref_test.py | \ ! RUN: fir-opt -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis-modref))' \ ! RUN: --mlir-disable-threading -o /dev/null 2>&1 | FileCheck %s ! Test fir.call modref for global variables (module, saved, common). module somemod implicit none real :: test_var_xmod interface subroutine may_capture(x) real, target :: x end subroutine end interface end module subroutine test_module use somemod, only : test_var_xmod implicit none call test_effect_external() end subroutine ! CHECK-LABEL: Testing : "_QPtest_module" ! CHECK: test_effect_external -> test_var_xmod#0: ModRef subroutine test_saved_local use somemod, only : may_capture implicit none real, save :: test_var_xsaved ! Capture is invalid after the call because test_var_xsaved does not have the ! target attribute. call may_capture(test_var_xsaved) call test_effect_external() end subroutine ! CHECK-LABEL: Testing : "_QPtest_saved_local" ! CHECK: test_effect_external -> test_var_xsaved#0: NoModRef subroutine test_saved_target use somemod, only : may_capture implicit none real, save, target :: test_var_target_xsaved call may_capture(test_var_target_xsaved) call test_effect_external() end subroutine ! CHECK-LABEL: Testing : "_QPtest_saved_target" ! CHECK: test_effect_external -> test_var_target_xsaved#0: ModRef subroutine test_saved_target_2 use somemod, only : may_capture implicit none real, save, target :: test_var_target_xsaved ! Pointer associations made to SAVE variables remain valid after the ! procedure exit, so it cannot be ruled out that the variable has been ! captured in a previous call to `test_var_target_xsaved` even though the ! call to `test_effect_external` appears first here. call test_effect_external() call may_capture(test_var_target_xsaved) end subroutine ! CHECK-LABEL: Testing : "_QPtest_saved_target_2" ! CHECK: test_effect_external -> test_var_target_xsaved#0: ModRef subroutine test_saved_used_in_internal implicit none real, save :: test_var_saved_captured call may_capture_procedure_pointer(internal) call test_effect_external() contains subroutine internal test_var_saved_captured = 0. end subroutine end subroutine ! CHECK-LABEL: Testing : "_QPtest_saved_used_in_internal" ! CHECK: test_effect_external -> test_var_saved_captured#0: ModRef subroutine test_common implicit none real :: test_var_x_common common /comm/ test_var_x_common call test_effect_external() end subroutine ! CHECK-LABEL: Testing : "_QPtest_common" ! CHECK: test_effect_external -> test_var_x_common#0: ModRef