Files
gcc-reflection/libgomp/testsuite/libgomp.fortran/use_device_ptr-optional-3.f90
supers1ngular a57b0e3ecb [PATCH v2 1/4] openmp: Bump Version from 4.5 to 5.2 (1/4)
Bumps OpenMP from 4.5 (201511) to 5.2 (202111), with deprecation and
test support to 5.1 (202011). Adds new tests and a new warning.
Suppresses deprecation warnings in all relevant tests and removes
suppression pragmas visible outside of the testsuite. Additionally
implements new warning in the relevant frontends. Otherwise, cleans
up some whitespace and fixed a misspelled pragma in a testcase. Also
fixes an indentation error.

gcc/c-family/ChangeLog:

	* c-cppbuiltin.cc (c_cpp_builtins): Bump _OPENMP version.
	* c.opt (Wdeprecated-openmp): Add warning.
	* c.opt.urls: Regenerated.

gcc/c/ChangeLog:

	* c-parser.cc (c_parser_omp_clause_proc_bind): Deprecate master
	affinity.
	(c_parser_omp_master): Deprecate master construct.
	(c_parser_transaction): Whitespace.

gcc/cp/ChangeLog:

	* parser.cc (cp_parser_postfix_expression): Whitespace.
	(cp_parser_builtin_c23_va_start): Ditto.
	(cp_parser_omp_clause_proc_bind): Deprecate master affinity.
	(cp_parser_omp_master): Deprecate master construct.

gcc/ChangeLog:

	* doc/invoke.texi: Update docs for '-Wdeprecated-openmp'.

gcc/fortran/ChangeLog:

	* cpp.cc (cpp_define_builtins): Bump _OPENMP version.
	* invoke.texi: Update docs for '-Wdeprecated-openmp'.
	* lang.opt (Wdeprecated-openmp): Add warning.
	* lang.opt.urls: Regenerated.
	* openmp.cc (gfc_match_omp_clauses): Deprecate master affinity
	policy.
	(gfc_match_omp_parallel_master): Deprecate master construct.
	(gfc_match_omp_parallel_master_taskloop): Ditto.
	(gfc_match_omp_parallel_master_taskloop_simd): Ditto.
	(gfc_match_omp_master): Ditto.
	(gfc_match_omp_master_taskloop): Ditto.
	(gfc_match_omp_master_taskloop_simd): Ditto.
	(resolve_omp_clauses): Warn for deprecated use of
	{use,is}_device_ptr.

libgomp/ChangeLog:

	* env.c (omp_display_env): Bump _OPENMP version.
	* fortran.c (ialias_redirect): Remove suppression pragmas.
	(omp_set_dynamic_8_): Ditto.
	(omp_set_nested_8_): Ditto.
	(omp_get_nested_): Ditto.
	* icv.c (omp_get_dynamic): Ditto.
	(omp_get_nested): Ditto.
	(ialias): Ditto.
	* omp_lib.f90.in: Bump openmp_version.
	* omp_lib.h.in: Ditto.
	* testsuite/libgomp.c++/affinity-1.C: Suppress deprecation
	warnings.
	* testsuite/libgomp.c++/ctor-1.C: Ditto.
	* testsuite/libgomp.c++/ctor-11.C: Ditto.
	* testsuite/libgomp.c++/ctor-13.C: Ditto.
	* testsuite/libgomp.c++/ctor-2.C: Ditto.
	* testsuite/libgomp.c++/ctor-5.C: Ditto.
	* testsuite/libgomp.c++/ctor-7.C: Ditto.
	* testsuite/libgomp.c++/depend-iterator-1.C: Ditto.
	* testsuite/libgomp.c++/loop-13.C: Ditto.
	* testsuite/libgomp.c++/master-1.C: Ditto.
	* testsuite/libgomp.c++/pr26943.C: Ditto.
	* testsuite/libgomp.c++/pr81130.C: Ditto.
	* testsuite/libgomp.c++/pr81314.C: Ditto.
	* testsuite/libgomp.c++/target-in-reduction-1.C: Ditto.
	* testsuite/libgomp.c++/target-in-reduction-2.C: Ditto.
	* testsuite/libgomp.c++/task-1.C: Ditto.
	* testsuite/libgomp.c++/task-2.C: Ditto.
	* testsuite/libgomp.c++/task-6.C: Ditto.
	* testsuite/libgomp.c++/task-reduction-7.C: Ditto.
	* testsuite/libgomp.c++/task-reduction-9.C: Ditto.
	* testsuite/libgomp.c++/taskloop-reduction-1.C: Ditto.
	* testsuite/libgomp.c-c++-common/cancel-taskgroup-4.c: Ditto.
	* testsuite/libgomp.c-c++-common/depend-inoutset-1.c: Ditto.
	* testsuite/libgomp.c-c++-common/depend-iterator-1.c: Ditto.
	* testsuite/libgomp.c-c++-common/master-combined-1.c: Ditto.
	* testsuite/libgomp.c-c++-common/target-in-reduction-1.c: Ditto.
	* testsuite/libgomp.c-c++-common/target-in-reduction-2.c: Ditto.
	* testsuite/libgomp.c-c++-common/task-detach-12.c: Ditto.
	* testsuite/libgomp.c-c++-common/task-reduction-15.c: Ditto.
	* testsuite/libgomp.c-c++-common/task-reduction-5.c: Ditto.
	* testsuite/libgomp.c-c++-common/task-reduction-6.c: Ditto.
	* testsuite/libgomp.c-c++-common/task-reduction-8.c: Ditto.
	* testsuite/libgomp.c-c++-common/taskloop-reduction-1.c: Ditto.
	* testsuite/libgomp.c-c++-common/taskloop-reduction-3.c: Ditto.
	* testsuite/libgomp.c-c++-common/taskloop-reduction-4.c: Ditto.
	* testsuite/libgomp.c/affinity-1.c: Remove extraneous dg
	instruction and add suppression.
	* testsuite/libgomp.c/critical-2.c: Suppress deprecation
	warnings.
	* testsuite/libgomp.c/debug-1.c: Ditto.
	* testsuite/libgomp.c/lib-1.c: Ditto.
	* testsuite/libgomp.c/loop-24.c: Ditto.
	* testsuite/libgomp.c/nestedfn-2.c: Ditto.
	* testsuite/libgomp.c/nestedfn-3.c: Ditto.
	* testsuite/libgomp.c/pr104385.c: Ditto.
	* testsuite/libgomp.c/target-31.c: Ditto.
	* testsuite/libgomp.c/target-34.c: Ditto.
	* testsuite/libgomp.c/target-critical-1.c: Ditto.
	* testsuite/libgomp.c/task-1.c: Ditto.
	* testsuite/libgomp.c/task-3.c: Ditto.
	* testsuite/libgomp.c/task-6.c: Ditto.
	* testsuite/libgomp.c/task-reduction-1.c: Ditto.
	* testsuite/libgomp.c/task-reduction-2.c: Ditto.
	* testsuite/libgomp.c/teams-1.c: Ditto.
	* testsuite/libgomp.c/vla-1.c: Ditto.
	* testsuite/libgomp.fortran/crayptr1.f90: Ditto.
	* testsuite/libgomp.fortran/depend-inoutset-1.f90: Ditto.
	* testsuite/libgomp.fortran/is_device_ptr-1.f90: Ditto.
	* testsuite/libgomp.fortran/is_device_ptr-2.f90: Ditto.
	* testsuite/libgomp.fortran/lib1.f90: Ditto.
	* testsuite/libgomp.fortran/lib2.f: Ditto.
	* testsuite/libgomp.fortran/lib3.f: Ditto.
	* testsuite/libgomp.fortran/omp_parse2.f90: Ditto.
	* testsuite/libgomp.fortran/openmp_version-1.f: Bump OMP version.
	* testsuite/libgomp.fortran/openmp_version-2.f90: Ditto.
	* testsuite/libgomp.fortran/parallel-master.f90: Suppress
	warnings.
	* testsuite/libgomp.fortran/pointer2.f90: Ditto.
	* testsuite/libgomp.fortran/reduction6.f90: Ditto.
	* testsuite/libgomp.fortran/target-firstprivate-1.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_addr-1.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_addr-2.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_addr-3.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_addr-4.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_addr-5.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_ptr-1.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_ptr-3.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_ptr-4.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_ptr-optional-1.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_ptr-optional-2.f90: Ditto.
	* testsuite/libgomp.fortran/use_device_ptr-optional-3.f90: Ditto.
	* testsuite/libgomp.c-c++-common/omp-atv-seq-dep.c: New test.
	* testsuite/libgomp.c-c++-common/omp-lock-hint-contended-dep.c:
	New test.
	* testsuite/libgomp.c-c++-common/omp-lock-hint-none-dep.c: New test.
	* testsuite/libgomp.c-c++-common/omp-lock-hint-speculative-dep.c:
	New test.
	* testsuite/libgomp.c-c++-common/omp-lock-hint-uncontended-dep.c:
	New test.
	* testsuite/libgomp.c/omp-proc-bind-master-dep.c: New test.
	* testsuite/libgomp.fortran/omp-atv-seq-dep.f90: New test.
	* testsuite/libgomp.fortran/omp-lock-hint-contended-dep.f90: New
	test.
	* testsuite/libgomp.fortran/omp-lock-hint-none-dep.f90: New test.
	* testsuite/libgomp.fortran/omp-lock-hint-speculative-dep.f90: New
	test.
	* testsuite/libgomp.fortran/omp-lock-hint-uncontended-dep.f90: New
	test.

gcc/testsuite/ChangeLog:

	* c-c++-common/cpp/openmp-define-3.c: Bump OMP version.
	* c-c++-common/gomp/Wparentheses-1.c: Suppress deprecation
	warnings.
	* c-c++-common/gomp/Wparentheses-3.c: Ditto.
	* c-c++-common/gomp/affinity-3.c: Ditto.
	* c-c++-common/gomp/allocate-18.c: Ditto.
	* c-c++-common/gomp/cancel-1.c: Ditto.
	* c-c++-common/gomp/clause-dups-1.c: Ditto.
	* c-c++-common/gomp/clauses-1.c: Suppress deprecation
	warnings and fix misspelled directive. Add
	'-Wunknown-pragmas'.
	* c-c++-common/gomp/clauses-6.c: Suppress deprecation warnings.
	* c-c++-common/gomp/declare-variant-1.c: Ditto.
	* c-c++-common/gomp/declare-variant-2.c: Ditto.
	* c-c++-common/gomp/depend-iterator-1.c: Ditto.
	* c-c++-common/gomp/lastprivate-conditional-1.c: Ditto.
	* c-c++-common/gomp/loop-1.c: Ditto.
	* c-c++-common/gomp/loop-2.c: Ditto.
	* c-c++-common/gomp/loop-3.c: Ditto.
	* c-c++-common/gomp/loop-4.c: Ditto.
	* c-c++-common/gomp/master-combined-1.c: Ditto.
	* c-c++-common/gomp/master-combined-2.c: Ditto.
	* c-c++-common/gomp/nesting-2.c: Ditto.
	* c-c++-common/gomp/pr100902-1.c: Ditto.
	* c-c++-common/gomp/pr61486-2.c: Ditto.
	* c-c++-common/gomp/pr85696.c: Ditto.
	* c-c++-common/gomp/pr85956.c: Ditto.
	* c-c++-common/gomp/pr98187.c: Ditto.
	* c-c++-common/gomp/pr99928-1.c: Ditto.
	* c-c++-common/gomp/pr99928-10.c: Ditto.
	* c-c++-common/gomp/pr99928-11.c: Ditto.
	* c-c++-common/gomp/pr99928-12.c: Ditto.
	* c-c++-common/gomp/pr99928-13.c: Ditto.
	* c-c++-common/gomp/pr99928-14.c: Ditto.
	* c-c++-common/gomp/pr99928-2.c: Ditto.
	* c-c++-common/gomp/pr99928-3.c: Ditto.
	* c-c++-common/gomp/pr99928-4.c: Ditto.
	* c-c++-common/gomp/pr99928-5.c: Ditto.
	* c-c++-common/gomp/pr99928-6.c: Ditto.
	* c-c++-common/gomp/pr99928-7.c: Ditto.
	* c-c++-common/gomp/pr99928-8.c: Ditto.
	* c-c++-common/gomp/pr99928-9.c: Ditto.
	* c-c++-common/gomp/task-detach-1.c: Ditto.
	* c-c++-common/gomp/teams-2.c: Ditto.
	* g++.dg/gomp/attrs-1.C: Ditto.
	* g++.dg/gomp/attrs-2.C: Ditto.
	* g++.dg/gomp/attrs-4.C: Ditto.
	* g++.dg/gomp/block-0.C: Ditto.
	* g++.dg/gomp/block-10.C: Ditto.
	* g++.dg/gomp/block-5.C: Ditto.
	* g++.dg/gomp/block-9.C: Ditto.
	* g++.dg/gomp/depend-iterator-1.C: Ditto.
	* g++.dg/gomp/master-1.C: Ditto.
	* g++.dg/gomp/master-2.C: Ditto.
	* g++.dg/gomp/master-3.C: Ditto.
	* g++.dg/gomp/method-1.C: Ditto.
	* g++.dg/gomp/pr29965-3.C: Ditto.
	* g++.dg/gomp/pr29965-9.C: Ditto.
	* g++.dg/gomp/pr78363-4.C: Ditto.
	* g++.dg/gomp/pr78363-6.C: Ditto.
	* g++.dg/gomp/pr79664.C: Ditto.
	* g++.dg/gomp/pr94477.C: Ditto.
	* g++.dg/gomp/pr94512.C: Ditto.
	* g++.dg/gomp/tpl-master-1.C: Ditto.
	* gcc.dg/gomp/appendix-a/a.12.1.c: Ditto.
	* gcc.dg/gomp/appendix-a/a.33.2.c: Ditto.
	* gcc.dg/gomp/attrs-1.c: Ditto.
	* gcc.dg/gomp/attrs-2.c: Ditto.
	* gcc.dg/gomp/attrs-4.c: Ditto.
	* gcc.dg/gomp/block-10.c: Ditto.
	* gcc.dg/gomp/block-5.c: Ditto.
	* gcc.dg/gomp/block-9.c: Ditto.
	* gcc.dg/gomp/master-1.c: Ditto.
	* gcc.dg/gomp/master-2.c: Ditto.
	* gcc.dg/gomp/master-3.c: Ditto.
	* gcc.dg/gomp/nesting-1.c: Ditto.
	* gcc.dg/gomp/pr104517.c: Ditto.
	* gcc.dg/gomp/pr29965-3.c: Ditto.
	* gcc.dg/gomp/pr35818.c: Ditto.
	* gcc.dg/gomp/pr91216.c: Ditto.
	* gcc.dg/gomp/sharing-2.c: Ditto.
	* gfortran.dg/gomp/adjust-args-10.f90: Ditto.
	* gfortran.dg/gomp/affinity-1.f90: Ditto.
	* gfortran.dg/gomp/allocate-clause.f90: Ditto.
	* gfortran.dg/gomp/appendix-a/a.12.1.f90: Ditto.
	* gfortran.dg/gomp/appendix-a/a.33.2.f90: Ditto.
	* gfortran.dg/gomp/c_ptr_tests_20.f90: Ditto.
	* gfortran.dg/gomp/c_ptr_tests_21.f90: Ditto.
	* gfortran.dg/gomp/cancel-1.f90: Ditto.
	* gfortran.dg/gomp/clauses-1.f90: Ditto.
	* gfortran.dg/gomp/declare-variant-1.f90: Ditto.
	* gfortran.dg/gomp/depend-iterator-1.f90: Ditto.
	* gfortran.dg/gomp/depend-iterator-2.f90: Ditto.
	* gfortran.dg/gomp/is_device_ptr-1.f90: Ditto.
	* gfortran.dg/gomp/is_device_ptr-2.f90: Ditto.
	* gfortran.dg/gomp/is_device_ptr-3.f90: Ditto.
	* gfortran.dg/gomp/lastprivate-conditional-1.f90: Ditto.
	* gfortran.dg/gomp/loop-4.f90: Ditto.
	* gfortran.dg/gomp/loop-exit.f90: Ditto.
	* gfortran.dg/gomp/map-3.f90: Ditto.
	* gfortran.dg/gomp/nesting-2.f90: Ditto.
	* gfortran.dg/gomp/nesting-3.f90: Ditto.
	* gfortran.dg/gomp/nowait-2.f90: Ditto.
	* gfortran.dg/gomp/nowait-4.f90: Ditto.
	* gfortran.dg/gomp/nowait-5.f90: Ditto.
	* gfortran.dg/gomp/openmp-simd-2.f90: Ditto.
	* gfortran.dg/gomp/openmp-simd-3.f90: Ditto.
	* gfortran.dg/gomp/parallel-master-1.f90: Ditto.
	* gfortran.dg/gomp/parallel-master-2.f90: Ditto.
	* gfortran.dg/gomp/pr107214-8.f90: Ditto.
	* gfortran.dg/gomp/pr48117.f90: Ditto.
	* gfortran.dg/gomp/pr94672.f90: Ditto.
	* gfortran.dg/gomp/pr99928-1.f90: Suppression + fix whitespace.
	* gfortran.dg/gomp/pr99928-11.f90: Suppression.
	* gfortran.dg/gomp/pr99928-2.f90: Suppression + fix whitespace.
	* gfortran.dg/gomp/pr99928-3.f90: Ditto.
	* gfortran.dg/gomp/pr99928-4.f90: Ditto.
	* gfortran.dg/gomp/pr99928-5.f90: Ditto.
	* gfortran.dg/gomp/pr99928-6.f90: Ditto.
	* gfortran.dg/gomp/pr99928-8.f90: Ditto.
	* gfortran.dg/gomp/sharing-3.f90: Suppress deprecation warnings.
	* gfortran.dg/gomp/strictly-structured-block-1.f90: Ditto.
	* gfortran.dg/gomp/strictly-structured-block-2.f90: Ditto.
	* gfortran.dg/gomp/target1.f90: Ditto.
	* gfortran.dg/gomp/taskloop-1.f90: Ditto.
	* gfortran.dg/gomp/taskloop-2.f90: Ditto.
	* gfortran.dg/openmp-define-3.f90: Bump expected version.
	* c-c++-common/gomp/master-construct-dep.c: New test.
	* gfortran.dg/gomp/master-construct-dep.f90: New test.
2025-12-11 06:38:51 -08:00

143 lines
4.7 KiB
Fortran

! { dg-do run }
! { dg-additional-options "-Wno-deprecated-openmp" }
! Check whether absent optional arguments are properly
! handled with use_device_{addr,ptr}.
program main
use iso_c_binding, only: c_ptr, c_loc, c_associated, c_f_pointer
implicit none (type, external)
integer, target :: u
integer, target :: v
integer, target :: w
integer, target :: x(4)
integer, target, allocatable :: y
integer, target, allocatable :: z(:)
type(c_ptr), target :: cptr
type(c_ptr), target :: cptr_in
integer :: dummy
u = 42
v = 5
w = 7
x = [3,4,6,2]
y = 88
z = [1,2,3]
!$omp target enter data map(to:u)
!$omp target data map(to:dummy) use_device_addr(u)
cptr_in = c_loc(u) ! Has to be outside 'foo' due to 'intent(in)'
!$omp end target data
call foo (u, v, w, x, y, z, cptr, cptr_in)
deallocate (y, z)
contains
subroutine foo (u, v, w, x, y, z, cptr, cptr_in)
integer, target, optional, value :: v
integer, target, optional :: u, w
integer, target, optional :: x(:)
integer, target, optional, allocatable :: y
integer, target, optional, allocatable :: z(:)
type(c_ptr), target, optional, value :: cptr
type(c_ptr), target, optional, value, intent(in) :: cptr_in
integer :: d
type(c_ptr) :: p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in
!$omp target enter data map(to:w, x, y, z)
!$omp target data map(dummy) use_device_addr(x)
cptr = c_loc(x)
!$omp end target data
! Need to map per-VALUE arguments, if present
if (present(v)) then
!$omp target enter data map(to:v)
else
stop 1
end if
if (present(cptr)) then
!$omp target enter data map(to:cptr)
else
stop 2
end if
if (present(cptr_in)) then
!$omp target enter data map(to:cptr_in)
else
stop 3
end if
!$omp target data map(d) use_device_addr(u, v, w, x, y, z)
!$omp target data map(d) use_device_addr(cptr, cptr_in)
if (.not. present(u)) stop 10
if (.not. present(v)) stop 11
if (.not. present(w)) stop 12
if (.not. present(x)) stop 13
if (.not. present(y)) stop 14
if (.not. present(z)) stop 15
if (.not. present(cptr)) stop 16
if (.not. present(cptr_in)) stop 17
p_u = c_loc(u)
p_v = c_loc(v)
p_w = c_loc(w)
p_x = c_loc(x)
p_y = c_loc(y)
p_z = c_loc(z)
p_cptr = c_loc(cptr)
p_cptr_in = c_loc(cptr_in)
!$omp end target data
!$omp end target data
call check(p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in, size(x), size(z))
end subroutine foo
subroutine check(p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in, Nx, Nz)
type(c_ptr), value :: p_u, p_v, p_w, p_x, p_y, p_z, p_cptr, p_cptr_in
integer, value :: Nx, Nz
integer, pointer :: c_u(:), c_v(:), c_w(:), c_x(:), c_y(:), c_z(:)
type(c_ptr), pointer :: c_cptr(:), c_cptr_in(:)
! As is_device_ptr does not handle scalars, we map them to a size-1 array
call c_f_pointer(p_u, c_u, shape=[1])
call c_f_pointer(p_v, c_v, shape=[1])
call c_f_pointer(p_w, c_w, shape=[1])
call c_f_pointer(p_x, c_x, shape=[Nx])
call c_f_pointer(p_y, c_y, shape=[1])
call c_f_pointer(p_z, c_z, shape=[Nz])
call c_f_pointer(p_cptr, c_cptr, shape=[1])
call c_f_pointer(p_cptr_in, c_cptr_in, shape=[1])
call run_target(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in, Nx, Nz)
end subroutine check
subroutine run_target(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in, Nx, Nz)
integer, target :: c_u(:), c_v(:), c_w(:), c_x(:), c_y(:), c_z(:)
type(c_ptr) :: c_cptr(:), c_cptr_in(:)
integer, value :: Nx, Nz
!$omp target is_device_ptr(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in) map(to:Nx, Nz)
call target_fn(c_u(1), c_v(1), c_w(1), c_x, c_y(1), c_z, c_cptr(1), c_cptr_in(1), Nx, Nz)
!$omp end target
end subroutine run_target
subroutine target_fn(c_u, c_v, c_w, c_x, c_y, c_z, c_cptr, c_cptr_in, Nx, Nz)
!$omp declare target
integer, target :: c_u, c_v, c_w, c_x(:), c_y, c_z(:)
type(c_ptr), value :: c_cptr, c_cptr_in
integer, value :: Nx, Nz
integer, pointer :: u, x(:)
if (c_u /= 42) stop 30
if (c_v /= 5) stop 31
if (c_w /= 7) stop 32
if (Nx /= 4) stop 33
if (any (c_x /= [3,4,6,2])) stop 34
if (c_y /= 88) stop 35
if (Nz /= 3) stop 36
if (any (c_z /= [1,2,3])) stop 37
if (.not. c_associated (c_cptr)) stop 38
if (.not. c_associated (c_cptr_in)) stop 39
if (.not. c_associated (c_cptr, c_loc(c_x))) stop 40
if (.not. c_associated (c_cptr_in, c_loc(c_u))) stop 41
call c_f_pointer(c_cptr_in, u)
call c_f_pointer(c_cptr, x, shape=[Nx])
if (u /= c_u .or. u /= 42) stop 42
if (any (x /= c_x)) stop 43
if (any (x /= [3,4,6,2])) stop 44
end subroutine target_fn
end program main