offtarget 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (886) hide show
  1. offload/__init__.py +10 -0
  2. offload/__main__.py +5 -0
  3. offload/_bundle.py +74 -0
  4. offload/_root/catalog/acc/claims.yaml +197 -0
  5. offload/_root/catalog/acc/clauses.yaml +391 -0
  6. offload/_root/catalog/acc/no_oracle.yaml +89 -0
  7. offload/_root/catalog/acc/out_of_scope.yaml +17 -0
  8. offload/_root/catalog/acc/rules.yaml +433 -0
  9. offload/_root/catalog/acc/semantic_atoms.yaml +27 -0
  10. offload/_root/catalog/acc/skeleton.yaml +1567 -0
  11. offload/_root/catalog/acc/spec_overrides.yaml +72 -0
  12. offload/_root/catalog/later_forms.yaml +76 -0
  13. offload/_root/catalog/machines.yaml +218 -0
  14. offload/_root/catalog/omp/claims.yaml +2047 -0
  15. offload/_root/catalog/omp/clauses.yaml +914 -0
  16. offload/_root/catalog/omp/derivations.yaml +177 -0
  17. offload/_root/catalog/omp/memory_modes.yaml +40 -0
  18. offload/_root/catalog/omp/no_oracle.yaml +373 -0
  19. offload/_root/catalog/omp/omp50_delta.yaml +377 -0
  20. offload/_root/catalog/omp/out_of_scope.yaml +64 -0
  21. offload/_root/catalog/omp/port_equivalence.yaml +352 -0
  22. offload/_root/catalog/omp/rules.yaml +3131 -0
  23. offload/_root/catalog/omp/rules_coverage.yaml +9939 -0
  24. offload/_root/catalog/omp/semantic_atoms.yaml +34 -0
  25. offload/_root/catalog/omp/skeleton.yaml +9181 -0
  26. offload/_root/catalog/omp/spec_overrides.yaml +932 -0
  27. offload/_root/catalog/toolchains.yaml +472 -0
  28. offload/_root/catalog/vendor_claims_generic.yaml +40925 -0
  29. offload/_root/data/canuse/b.json +1 -0
  30. offload/_root/data/canuse/c.json +1 -0
  31. offload/_root/data/canuse/columns.json +1 -0
  32. offload/_root/data/canuse/d.json +1 -0
  33. offload/_root/data/canuse/f.json +1 -0
  34. offload/_root/data/canuse/index.json +1 -0
  35. offload/_root/data/canuse/p.json +1 -0
  36. offload/_root/data/compilers/afar.json +1 -0
  37. offload/_root/data/compilers/cce19.json +1 -0
  38. offload/_root/data/compilers/cce20.json +1 -0
  39. offload/_root/data/compilers/cce21.json +1 -0
  40. offload/_root/data/compilers/cce21_4.json +1 -0
  41. offload/_root/data/compilers/gcc.json +1 -0
  42. offload/_root/data/compilers/gcc_sm80.json +1 -0
  43. offload/_root/data/compilers/nvhpc.json +1 -0
  44. offload/_root/data/compilers/nvhpc269.json +1 -0
  45. offload/_root/data/findings/AUTHORING.md +107 -0
  46. offload/_root/data/findings/README.md +33 -0
  47. offload/_root/data/findings/afar-c-error-directive-in-target-link.c +37 -0
  48. offload/_root/data/findings/afar-c-lastprivate-distribute-parallel-for-small-type.c +56 -0
  49. offload/_root/data/findings/afar-c-teams-distribute-reduction-first-team.c +59 -0
  50. offload/_root/data/findings/afar-c-update-iterator-copy-mode.c +45 -0
  51. offload/_root/data/findings/afar-c-xnack1-target-is-present.c +31 -0
  52. offload/_root/data/findings/afar-cce19-character-defaultmap.f90 +27 -0
  53. offload/_root/data/findings/afar-cce19-task-in-target-ice.f90 +23 -0
  54. offload/_root/data/findings/afar-clang-requires-device-safesync-hang.c +24 -0
  55. offload/_root/data/findings/afar-flang-firstprivate-map-two-targets.f90 +34 -0
  56. offload/_root/data/findings/afar-flang-loop-bind-teams-reduction.f90 +27 -0
  57. offload/_root/data/findings/afar-flang-task-reduction-max.f90 +31 -0
  58. offload/_root/data/findings/afar-flang-thread-limit-target-parallel-do.f90 +22 -0
  59. offload/_root/data/findings/afar-linear-ref-omp50.f90 +29 -0
  60. offload/_root/data/findings/afar-loop-bind-thread-in-teams.f90 +44 -0
  61. offload/_root/data/findings/afar-nontemporal-assumed-shape-ice.f90 +38 -0
  62. offload/_root/data/findings/afar-udr-derived-type-link.f90 +41 -0
  63. offload/_root/data/findings/afar-xnack1-atomic-min-nested-parallel.f90 +53 -0
  64. offload/_root/data/findings/afar-xnack1-present-not-enforced.f90 +36 -0
  65. offload/_root/data/findings/afar-xnack1-target-is-present.f90 +47 -0
  66. offload/_root/data/findings/apps/afar-cce-teams-private-array-nested-parallel-wrong.f90 +100 -0
  67. offload/_root/data/findings/apps/cce20-device-link-infer-address-spaces-crash.f90 +159 -0
  68. offload/_root/data/findings/apps/cce21-device-link-agpr-copy-mfma-assert.f90 +343 -0
  69. offload/_root/data/findings/apps/cce21-private-array-loaded-subscript-wrong.f90 +113 -0
  70. offload/_root/data/findings/apps/controls/bubble-simple-rddot.f90 +284 -0
  71. offload/_root/data/findings/apps/controls/bubble-two-substeps.f90 +287 -0
  72. offload/_root/data/findings/apps/controls/cbc-inline.f90 +97 -0
  73. offload/_root/data/findings/apps/controls/cbc-integers.f90 +91 -0
  74. offload/_root/data/findings/apps/controls/cbc-only-density.f90 +97 -0
  75. offload/_root/data/findings/apps/controls/cbc-only-velocity.f90 +97 -0
  76. offload/_root/data/findings/apps/controls/gcc-acc-c-tile-control.c +26 -0
  77. offload/_root/data/findings/apps/controls/gcc-acc-tile-control.f90 +29 -0
  78. offload/_root/data/findings/apps/controls/private-array-subscript-probes.f90 +45 -0
  79. offload/_root/data/findings/apps/controls/teams-private-array-read-par.f90 +31 -0
  80. offload/_root/data/findings/apps/controls/teams-private-array-seq.f90 +30 -0
  81. offload/_root/data/findings/apps/controls/teams-private-array-shared.f90 +34 -0
  82. offload/_root/data/findings/apps/controls/teams-private-array-split.f90 +36 -0
  83. offload/_root/data/findings/apps/controls/teams-private-array-write-par.f90 +31 -0
  84. offload/_root/data/findings/apps/gcc-acc-c-tile-partial-tiles-wrong.c +60 -0
  85. offload/_root/data/findings/apps/gcc-acc-tile-partial-tiles-wrong.f90 +64 -0
  86. offload/_root/data/findings/catalog/afar-c-complex-reduction-link.c +66 -0
  87. offload/_root/data/findings/catalog/afar-c-critical-hint-link.c +68 -0
  88. offload/_root/data/findings/catalog/afar-c-ordered-doacross-link.c +62 -0
  89. offload/_root/data/findings/catalog/afar-c-reduction-task-link.c +81 -0
  90. offload/_root/data/findings/catalog/afar-flang-absent-optional-target-crash.f90 +76 -0
  91. offload/_root/data/findings/catalog/afar-flang-critical-target-parallel-wrong.f90 +74 -0
  92. offload/_root/data/findings/catalog/afar-flang-dist-schedule-chunk.f90 +80 -0
  93. offload/_root/data/findings/catalog/afar-flang-linear-parallel-ice.f90 +68 -0
  94. offload/_root/data/findings/catalog/afar-flang-named-critical-link.f90 +67 -0
  95. offload/_root/data/findings/catalog/afar-flang-ordered-wrong.f90 +78 -0
  96. offload/_root/data/findings/catalog/afar-flang-reduction-minus-rejected.f90 +77 -0
  97. offload/_root/data/findings/catalog/afar-flang-reduction-task-ice.f90 +68 -0
  98. offload/_root/data/findings/catalog/afar-flang-sections-in-target-ice.f90 +67 -0
  99. offload/_root/data/findings/catalog/afar-flang-workdistribute-ice.f90 +71 -0
  100. offload/_root/data/findings/catalog/c-allocate-const-mem-firstprivate-wrong.c +79 -0
  101. offload/_root/data/findings/catalog/cce-acc-allocate-in-compute-crash.f90 +65 -0
  102. offload/_root/data/findings/catalog/cce-acc-character-dummy-routine-ice.f90 +81 -0
  103. offload/_root/data/findings/catalog/cce-acc-loop-seq-in-routine-wrong.f90 +81 -0
  104. offload/_root/data/findings/catalog/cce-acc-stop-in-compute-crash.f90 +62 -0
  105. offload/_root/data/findings/catalog/cce-allocators-stack-ice.f90 +81 -0
  106. offload/_root/data/findings/catalog/cce-atomic-default-mem-order-acquire-release-rejected.f90 +61 -0
  107. offload/_root/data/findings/catalog/cce-c-allocate-align-link.c +83 -0
  108. offload/_root/data/findings/catalog/cce-c-allocate-allocator-modifier-rejected.c +77 -0
  109. offload/_root/data/findings/catalog/cce-c-device-type-directive-name-ice.c +70 -0
  110. offload/_root/data/findings/catalog/cce-c-dist-schedule-chunk.c +81 -0
  111. offload/_root/data/findings/catalog/cce-c-f-pointer-device-link.f90 +70 -0
  112. offload/_root/data/findings/catalog/cce-c-lastprivate-parallel-in-seq-loop-wrong.c +64 -0
  113. offload/_root/data/findings/catalog/cce-c-long-double-ice.c +61 -0
  114. offload/_root/data/findings/catalog/cce-c-map-iterator-ice.c +92 -0
  115. offload/_root/data/findings/catalog/cce-c-motion-iterator-rejected.c +68 -0
  116. offload/_root/data/findings/catalog/cce-c-ordered-doacross-link.c +64 -0
  117. offload/_root/data/findings/catalog/cce-c-ordered-link.c +77 -0
  118. offload/_root/data/findings/catalog/cce-c-recursive-function-ice.c +62 -0
  119. offload/_root/data/findings/catalog/cce-c-reduction-inscan-ice.c +67 -0
  120. offload/_root/data/findings/catalog/cce-c-reduction-task-link.c +73 -0
  121. offload/_root/data/findings/catalog/cce-c-sections-in-target-wrong.c +70 -0
  122. offload/_root/data/findings/catalog/cce-c-single-masked-task-link.c +66 -0
  123. offload/_root/data/findings/catalog/cce-c-task-in-target-link.c +75 -0
  124. offload/_root/data/findings/catalog/cce-c-uses-allocators-traits-rejected.c +71 -0
  125. offload/_root/data/findings/catalog/cce-flang-allocate-const-mem-ice.f90 +67 -0
  126. offload/_root/data/findings/catalog/cce-flang-allocate-in-target-crash.f90 +68 -0
  127. offload/_root/data/findings/catalog/cce-flang-lastprivate-parallel-in-seq-loop-wrong.f90 +83 -0
  128. offload/_root/data/findings/catalog/cce-flang-stop-in-target-crash.f90 +64 -0
  129. offload/_root/data/findings/catalog/cce-iterator-link.f90 +67 -0
  130. offload/_root/data/findings/catalog/cce-linear-lastprivate-ice.f90 +69 -0
  131. offload/_root/data/findings/catalog/cce-nohost-link.f90 +90 -0
  132. offload/_root/data/findings/catalog/cce-reduction-inscan-ice.f90 +66 -0
  133. offload/_root/data/findings/catalog/cce-reduction-task-link.f90 +76 -0
  134. offload/_root/data/findings/catalog/cce19-reduction-task-addrspacecast-ice.f90 +77 -0
  135. offload/_root/data/findings/catalog/cce20-c-defaultmap-private-storage-rejected.c +85 -0
  136. offload/_root/data/findings/catalog/cce20-map-self-rejected.f90 +64 -0
  137. offload/_root/data/findings/catalog/cce21-c-declare-target-local-rejected.c +73 -0
  138. offload/_root/data/findings/catalog/cce21-c-target-loop-ice.c +77 -0
  139. offload/_root/data/findings/catalog/defaultmap-present-private-array-abort.f90 +73 -0
  140. offload/_root/data/findings/catalog/nvhpc-acc-associate-illegal-address.f90 +66 -0
  141. offload/_root/data/findings/catalog/nvhpc-c-function-pointer-kernel-missing.c +68 -0
  142. offload/_root/data/findings/catalog/nvhpc-c-long-double-kernel-missing.c +64 -0
  143. offload/_root/data/findings/catalog/nvhpc-c-static-local-kernel-missing.c +73 -0
  144. offload/_root/data/findings/catalog/nvhpc-c-vla-kernel-missing.c +63 -0
  145. offload/_root/data/findings/catalog/nvhpc-flang-type-bound-kernel-missing.f90 +86 -0
  146. offload/_root/data/findings/cce-acc-init-set-runtime-assert.f90 +35 -0
  147. offload/_root/data/findings/cce-acc-reduction-200-int8-scalars-wrong.f90 +1278 -0
  148. offload/_root/data/findings/cce-acc-routine-bind-module-ice.f90 +35 -0
  149. offload/_root/data/findings/cce-acc-self-condition-ignored.f90 +17 -0
  150. offload/_root/data/findings/cce-c-dist-schedule-segv.c +34 -0
  151. offload/_root/data/findings/cce-c-map-delete-refcount.c +47 -0
  152. offload/_root/data/findings/cce-c-map-present-assert.c +45 -0
  153. offload/_root/data/findings/cce-c-openmp45-device-link.c +34 -0
  154. offload/_root/data/findings/cce-c-parallel-for-in-target.c +73 -0
  155. offload/_root/data/findings/cce-defaultmap-tofrom-explicit-map.f90 +92 -0
  156. offload/_root/data/findings/cce-mapper-next-map-copy-back.f90 +48 -0
  157. offload/_root/data/findings/cce-trim-merge-output-one-character.f90 +40 -0
  158. offload/_root/data/findings/cce-uses-allocators-traits-omp50.f90 +28 -0
  159. offload/_root/data/findings/cce19-acc-if-false-link.f90 +17 -0
  160. offload/_root/data/findings/cce19-c-reduction-63-scalars-one-wrong.c +235 -0
  161. offload/_root/data/findings/cce19-target-parallel-guarded-loop.f90 +35 -0
  162. offload/_root/data/findings/cce19-target-parallel-single-ice.f90 +38 -0
  163. offload/_root/data/findings/cce21-alloc-2e32-sum-wrong.f90 +68 -0
  164. offload/_root/data/findings/cce21-defaultmap-aggregate-flag.f90 +52 -0
  165. offload/_root/data/findings/cce21-in-reduction-assumed-shape-write-lost.f90 +61 -0
  166. offload/_root/data/findings/cce21-in-reduction-taskwait-link.f90 +59 -0
  167. offload/_root/data/findings/cce21-linear-modifier-default-none.f90 +59 -0
  168. offload/_root/data/findings/clang-c-declare-target-to-omp52.c +50 -0
  169. offload/_root/data/findings/clang-c-linear-directive-name-hang.c +30 -0
  170. offload/_root/data/findings/clang-c-map-iterator-omp51.c +51 -0
  171. offload/_root/data/findings/clang-c-shared-declare-target-combined.c +58 -0
  172. offload/_root/data/findings/dataenv/cce-value-dummy-target-write-visible.f90 +74 -0
  173. offload/_root/data/findings/defaultmap-none-loop-variable.f90 +69 -0
  174. offload/_root/data/findings/fortran-loop-bind-thread-in-parallel.f90 +53 -0
  175. offload/_root/data/findings/fortran-schedule-static-in-target.f90 +55 -0
  176. offload/_root/data/findings/fresh/cce-common-block-name-in-map-rejected.f90 +47 -0
  177. offload/_root/data/findings/fresh/cce-if-stop-in-target-ice-one-condition.f90 +38 -0
  178. offload/_root/data/findings/fresh/cce-if-stop-in-target-ice.f90 +43 -0
  179. offload/_root/data/findings/fresh/cce-list-directed-print-in-target-copy-crash.f90 +40 -0
  180. offload/_root/data/findings/fresh/cce19-acc-automatic-array-copyout-copy-crash.f90 +56 -0
  181. offload/_root/data/findings/fresh/cce21-combined-if-runtime-expr-loop-skipped.f90 +57 -0
  182. offload/_root/data/findings/fresh/nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.f90 +67 -0
  183. offload/_root/data/findings/fresh/nvhpc-teams-loop-module-allocatable-assign-fort2-crash.f90 +73 -0
  184. offload/_root/data/findings/fuzz/1131-afar.f90 +48 -0
  185. offload/_root/data/findings/fuzz/1391-cce20.f90 +40 -0
  186. offload/_root/data/findings/fuzz/14-cce20.f90 +36 -0
  187. offload/_root/data/findings/fuzz/1505-cce20.f90 +88 -0
  188. offload/_root/data/findings/fuzz/1540-afar.f90 +44 -0
  189. offload/_root/data/findings/fuzz/158-afar.f90 +63 -0
  190. offload/_root/data/findings/fuzz/16-cce20.f90 +39 -0
  191. offload/_root/data/findings/fuzz/1644-cce21.f90 +31 -0
  192. offload/_root/data/findings/fuzz/165-cce19.f90 +52 -0
  193. offload/_root/data/findings/fuzz/1749-cce20.f90 +34 -0
  194. offload/_root/data/findings/fuzz/1936-afar.f90 +61 -0
  195. offload/_root/data/findings/fuzz/1978-cce19.f90 +41 -0
  196. offload/_root/data/findings/fuzz/2014-cce19.f90 +46 -0
  197. offload/_root/data/findings/fuzz/2224-cce19.f90 +30 -0
  198. offload/_root/data/findings/fuzz/2334-cce19.f90 +57 -0
  199. offload/_root/data/findings/fuzz/536-cce19.f90 +38 -0
  200. offload/_root/data/findings/fuzz/591-cce19.f90 +54 -0
  201. offload/_root/data/findings/fuzz/650-afar.f90 +58 -0
  202. offload/_root/data/findings/fuzz/698-afar.f90 +68 -0
  203. offload/_root/data/findings/fuzz/700-afar.f90 +46 -0
  204. offload/_root/data/findings/fuzz/775-cce21.f90 +33 -0
  205. offload/_root/data/findings/fuzz/87-afar.f90 +47 -0
  206. offload/_root/data/findings/fuzz/916-afar.f90 +67 -0
  207. offload/_root/data/findings/fuzz/958-cce20.f90 +44 -0
  208. offload/_root/data/findings/fuzz/98-cce19.f90 +40 -0
  209. offload/_root/data/findings/fuzz/README.md +236 -0
  210. offload/_root/data/findings/fuzz/b1-121-afar.f90 +47 -0
  211. offload/_root/data/findings/fuzz/b1-183-afar.f90 +55 -0
  212. offload/_root/data/findings/fuzz/b1-22-cce20.f90 +38 -0
  213. offload/_root/data/findings/fuzz/b1-231-afar.f90 +56 -0
  214. offload/_root/data/findings/fuzz/b1-268-afar.f90 +46 -0
  215. offload/_root/data/findings/fuzz/b2-183-afar.f90 +57 -0
  216. offload/_root/data/findings/fuzz/b2-209-cce19.f90 +51 -0
  217. offload/_root/data/findings/fuzz/b2-213-afar.f90 +63 -0
  218. offload/_root/data/findings/fuzz/b2-52-afar.f90 +56 -0
  219. offload/_root/data/findings/fuzz/b2-68-afar.f90 +54 -0
  220. offload/_root/data/findings/fuzz/b2-85-cce20.f90 +55 -0
  221. offload/_root/data/findings/fuzz/b3-188-cce19.f90 +90 -0
  222. offload/_root/data/findings/fuzz/b3-190-cce21.f90 +88 -0
  223. offload/_root/data/findings/fuzz/b3-197-cce19.f90 +77 -0
  224. offload/_root/data/findings/fuzz/b3-250-cce20.f90 +89 -0
  225. offload/_root/data/findings/fuzz/b3-278-cce19.f90 +70 -0
  226. offload/_root/data/findings/fuzz/b3-45-cce21.f90 +83 -0
  227. offload/_root/data/findings/fuzz/b3-54-afar.f90 +67 -0
  228. offload/_root/data/findings/fuzz/b3-61-cce20.f90 +100 -0
  229. offload/_root/data/findings/fuzz/b3-9-afar.f90 +100 -0
  230. offload/_root/data/findings/fuzz/b3-9-cce21.f90 +103 -0
  231. offload/_root/data/findings/fuzz/b3-94-afar.f90 +80 -0
  232. offload/_root/data/findings/fuzz/b4-39-afar.f90 +141 -0
  233. offload/_root/data/findings/fuzz/b4-86-cce19.f90 +71 -0
  234. offload/_root/data/findings/fuzz/controls/gcc-complex-pointer-store-control.f90 +28 -0
  235. offload/_root/data/findings/fuzz/controls/gcc-declare-reduction-module-control.f90 +29 -0
  236. offload/_root/data/findings/fuzz/controls/gcc-target-simd-map-nontemporal-control.f90 +21 -0
  237. offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-mapped-control.f90 +22 -0
  238. offload/_root/data/findings/fuzz/controls/nvhpc-allocatable-component-unreferenced-control.f90 +22 -0
  239. offload/_root/data/findings/fuzz/controls/nvhpc-default-none-removed-control.f90 +18 -0
  240. offload/_root/data/findings/fuzz/controls/nvhpc-default-shared-control.f90 +18 -0
  241. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-firstprivate-removed-control.f90 +15 -0
  242. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-reduction-mapped-control.f90 +17 -0
  243. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-to-scalar-removed-control.f90 +17 -0
  244. offload/_root/data/findings/fuzz/controls/nvhpc-defaultmap-tofrom-lastprivate-control.f90 +15 -0
  245. offload/_root/data/findings/fuzz/controls/nvhpc-depend-explicit-map-control.f90 +22 -0
  246. offload/_root/data/findings/fuzz/controls/nvhpc-depend-removed-control.f90 +22 -0
  247. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-end-distribute-control.f90 +16 -0
  248. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-num-threads-removed-control.f90 +26 -0
  249. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-parallel-removed-control.f90 +22 -0
  250. offload/_root/data/findings/fuzz/controls/nvhpc-distribute-simd-no-end-directive-control.f90 +15 -0
  251. offload/_root/data/findings/fuzz/controls/nvhpc-explicit-length-character-dummy-control.f90 +18 -0
  252. offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-array-value-control.f90 +23 -0
  253. offload/_root/data/findings/fuzz/controls/nvhpc-loop-character-distribute-control.f90 +20 -0
  254. offload/_root/data/findings/fuzz/controls/nvhpc-map-always-first-control.f90 +15 -0
  255. offload/_root/data/findings/fuzz/controls/nvhpc-map-always-removed-control.f90 +15 -0
  256. offload/_root/data/findings/fuzz/controls/nvhpc-num-threads-removed-control.f90 +12 -0
  257. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-firstprivate-dropped-control.f90 +15 -0
  258. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-single-nowait-control.f90 +13 -0
  259. offload/_root/data/findings/fuzz/controls/nvhpc-target-parallel-split-control.f90 +15 -0
  260. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-collapse-split-control.f90 +21 -0
  261. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-end-directive-control.f90 +14 -0
  262. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-no-collapse-control.f90 +19 -0
  263. offload/_root/data/findings/fuzz/controls/nvhpc-target-simd-split-no-end-directive-control.f90 +15 -0
  264. offload/_root/data/findings/fuzz/gcc-declare-reduction-module-not-found.f90 +66 -0
  265. offload/_root/data/findings/fuzz/gcc-strided-target-update-rejected.f90 +58 -0
  266. offload/_root/data/findings/fuzz/gcc-target-simd-map-nontemporal-rejected.f90 +54 -0
  267. offload/_root/data/findings/fuzz/nvhpc-allocatable-component-implicit-map-illegal-address.f90 +84 -0
  268. offload/_root/data/findings/fuzz/nvhpc-assumed-length-character-dummy-map-ice.f90 +69 -0
  269. offload/_root/data/findings/fuzz/nvhpc-default-none-reduction-lastprivate-fort1-crash.f90 +70 -0
  270. offload/_root/data/findings/fuzz/nvhpc-defaultmap-firstprivate-lastprivate-ice.f90 +71 -0
  271. offload/_root/data/findings/fuzz/nvhpc-defaultmap-to-scalar-reduction-lost.f90 +82 -0
  272. offload/_root/data/findings/fuzz/nvhpc-depend-implicit-map-illegal-address.f90 +81 -0
  273. offload/_root/data/findings/fuzz/nvhpc-distribute-parallel-num-threads-writes-lost.f90 +79 -0
  274. offload/_root/data/findings/fuzz/nvhpc-end-distribute-simd-rejected.f90 +70 -0
  275. offload/_root/data/findings/fuzz/nvhpc-loop-character-achar-unsupported.f90 +75 -0
  276. offload/_root/data/findings/fuzz/nvhpc-map-always-after-map-to-not-copied-back.f90 +70 -0
  277. offload/_root/data/findings/fuzz/nvhpc-num-threads-reduction-identity-lost.f90 +54 -0
  278. offload/_root/data/findings/fuzz/nvhpc-target-parallel-firstprivate-translate-failure.f90 +66 -0
  279. offload/_root/data/findings/fuzz/nvhpc-target-parallel-single-hang.f90 +68 -0
  280. offload/_root/data/findings/fuzz/nvhpc-target-simd-collapse-translate-failure.f90 +73 -0
  281. offload/_root/data/findings/fuzz/nvhpc-target-simd-no-end-directive-rejected.f90 +68 -0
  282. offload/_root/data/findings/fuzz/par-s1-2082-gcc_g90.f90 +71 -0
  283. offload/_root/data/findings/fuzz/s1-2370-cce21.f90 +67 -0
  284. offload/_root/data/findings/fuzz/s1-2592-cce21.f90 +56 -0
  285. offload/_root/data/findings/fuzz/s1-3463-cce21.f90 +92 -0
  286. offload/_root/data/findings/fuzz/s1-4339-afar.f90 +79 -0
  287. offload/_root/data/findings/fuzz/s1-6085-cce21.f90 +96 -0
  288. offload/_root/data/findings/fuzz/s1-6760-cce20.f90 +65 -0
  289. offload/_root/data/findings/fuzz/s1-6888-cce21.f90 +76 -0
  290. offload/_root/data/findings/fuzz/s1-7882-cce20.f90 +63 -0
  291. offload/_root/data/findings/fuzz/s1-8634-cce21.f90 +45 -0
  292. offload/_root/data/findings/fuzz/s1-91-cce21.f90 +92 -0
  293. offload/_root/data/findings/fuzz/s1-9443-afar.f90 +59 -0
  294. offload/_root/data/findings/fuzz/s1-9914-cce19.f90 +78 -0
  295. offload/_root/data/findings/gcc/controls/gcc-acc-c-detach-control.c +34 -0
  296. offload/_root/data/findings/gcc/controls/gcc-acc-detach-control.f90 +26 -0
  297. offload/_root/data/findings/gcc/controls/gcc-defaultmap-to-pointer-control.f90 +31 -0
  298. offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.c +26 -0
  299. offload/_root/data/findings/gcc/controls/gcc-target-in-task-control.f90 +21 -0
  300. offload/_root/data/findings/gcc/gcc-acc-bind-device-type-rejected.f90 +71 -0
  301. offload/_root/data/findings/gcc/gcc-acc-c-bind-device-type-rejected.c +76 -0
  302. offload/_root/data/findings/gcc/gcc-acc-c-detach-delete-attach-underflow.c +74 -0
  303. offload/_root/data/findings/gcc/gcc-acc-c-gang-dim-rejected.c +79 -0
  304. offload/_root/data/findings/gcc/gcc-acc-c-link-in-routine-rejected.c +82 -0
  305. offload/_root/data/findings/gcc/gcc-acc-detach-delete-attach-underflow.f90 +66 -0
  306. offload/_root/data/findings/gcc/gcc-acc-gang-dim-collapse-force-rejected.f90 +69 -0
  307. offload/_root/data/findings/gcc/gcc-acc-init-set-shutdown-rejected.f90 +70 -0
  308. offload/_root/data/findings/gcc/gcc-acc-link-in-routine-rejected.f90 +82 -0
  309. offload/_root/data/findings/gcc/gcc-acc-use-device-allocatable-rejected.f90 +88 -0
  310. offload/_root/data/findings/gcc/gcc-c-motion-mapper-rejected.c +110 -0
  311. offload/_root/data/findings/gcc/gcc-c-omp60-undocumented-rejected.c +76 -0
  312. offload/_root/data/findings/gcc/gcc-c-omp60-unimplemented-rejected.c +119 -0
  313. offload/_root/data/findings/gcc/gcc-c-target-in-task-mandatory-device-not-found.c +87 -0
  314. offload/_root/data/findings/gcc/gcc-c-uses-allocators-traits-unimplemented.c +85 -0
  315. offload/_root/data/findings/gcc/gcc-declare-mapper-rejected.f90 +85 -0
  316. offload/_root/data/findings/gcc/gcc-defaultmap-to-pointer-copy-back.f90 +66 -0
  317. offload/_root/data/findings/gcc/gcc-loop-bind-default-none-rejected.f90 +93 -0
  318. offload/_root/data/findings/gcc/gcc-omp60-undocumented-rejected.f90 +72 -0
  319. offload/_root/data/findings/gcc/gcc-omp60-unimplemented-rejected.f90 +112 -0
  320. offload/_root/data/findings/gcc/gcc-target-in-task-mandatory-device-not-found.f90 +83 -0
  321. offload/_root/data/findings/gcc/gcc-uses-allocators-traits-unimplemented.f90 +78 -0
  322. offload/_root/data/findings/harvest/afar-flang-strided-target-update.f90 +96 -0
  323. offload/_root/data/findings/harvest/cce-acc-declare-create-module-allocatable-xnack1-fault.f90 +58 -0
  324. offload/_root/data/findings/harvest/cce-c-implicit-struct-map-partly-present.c +100 -0
  325. offload/_root/data/findings/harvest/cce-c-strided-target-update.c +74 -0
  326. offload/_root/data/findings/harvest/cce-ftn-target-parallel-thread-query-ice.f90 +67 -0
  327. offload/_root/data/findings/harvest/cce-named-constant-array-declare-target-routine-rejected.f90 +69 -0
  328. offload/_root/data/findings/harvest/cce-use-device-ptr-c-ptr-not-converted.f90 +64 -0
  329. offload/_root/data/findings/harvest/cce21-declare-target-link-module-variable-write-lost.f90 +63 -0
  330. offload/_root/data/findings/harvest/cce21-internal-procedure-calls-internal-in-target-fault.f90 +71 -0
  331. offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-target-only-control.c +22 -0
  332. offload/_root/data/findings/harvest/controls/cce-c-implicit-struct-map-partly-present-whole-control.c +23 -0
  333. offload/_root/data/findings/harvest/controls/gcc-acc-declare-create-allocatable-control.f90 +34 -0
  334. offload/_root/data/findings/harvest/controls/gcc-c-same-item-two-maps-control.c +17 -0
  335. offload/_root/data/findings/harvest/controls/gcc-c-target-data-struct-pointer-section-control.c +27 -0
  336. offload/_root/data/findings/harvest/controls/gcc-c-target-data-two-maps-control.c +20 -0
  337. offload/_root/data/findings/harvest/controls/gcc-same-item-two-maps-control.f90 +16 -0
  338. offload/_root/data/findings/harvest/controls/gcc-teams-simd-matmul-allocatable-control.f90 +27 -0
  339. offload/_root/data/findings/harvest/gcc-acc-declare-create-allocatable-not-mapped.f90 +66 -0
  340. offload/_root/data/findings/harvest/gcc-c-same-item-two-maps-rejected.c +45 -0
  341. offload/_root/data/findings/harvest/gcc-c-strided-section-rejected.c +70 -0
  342. offload/_root/data/findings/harvest/gcc-c-target-data-struct-pointer-section-ice.c +78 -0
  343. offload/_root/data/findings/harvest/gcc-c-target-data-two-maps-ice.c +49 -0
  344. offload/_root/data/findings/harvest/gcc-same-item-two-maps-rejected.f90 +46 -0
  345. offload/_root/data/findings/harvest/gcc-teams-simd-matmul-allocatable-ice.f90 +53 -0
  346. offload/_root/data/findings/harvest/nvhpc-c-target-data-if-false-use-device-ptr-garbage.c +49 -0
  347. offload/_root/data/findings/harvest/nvhpc-named-constant-array-declare-target-routine-rejected.f90 +65 -0
  348. offload/_root/data/findings/harvest/nvhpc-use-device-ptr-c-ptr-not-found.f90 +60 -0
  349. offload/_root/data/findings/harvest/nvhpc2511-target-nowait-in-parallel-for-ice.c +59 -0
  350. offload/_root/data/findings/hecbench/controls/f16-ctl-float-array.c +28 -0
  351. offload/_root/data/findings/hecbench/controls/pc-ctl-builtin-popcount.c +37 -0
  352. offload/_root/data/findings/hecbench/controls/pc-ctl-shift-sum.c +43 -0
  353. offload/_root/data/findings/hecbench/gcc-c-float16-array-in-target-lto-ice.c +65 -0
  354. offload/_root/data/findings/hecbench/gcc-c-swar-popcount-assembler-error.c +80 -0
  355. offload/_root/data/findings/index.yaml +2453 -0
  356. offload/_root/data/findings/malloc/afar-device-malloc-in-kernel-corrupts-records.c +371 -0
  357. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-direct.c +52 -0
  358. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-fence.c +57 -0
  359. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-flush.c +57 -0
  360. offload/_root/data/findings/malloc/controls/afar-first-use-malloc-stack.c +52 -0
  361. offload/_root/data/findings/multithread-allocatable-section-maps.f90 +91 -0
  362. offload/_root/data/findings/nested/afar-cce-c-call-result-member-in-target-rejected.c +69 -0
  363. offload/_root/data/findings/nested/afar-cce-c-update-struct-and-member-rejected.c +92 -0
  364. offload/_root/data/findings/nested/afar-flang-pointer-root-allocatable-component-enter-data-fault.f90 +121 -0
  365. offload/_root/data/findings/nested/cce-c-struct-and-nested-pointee-sections-ice.c +79 -0
  366. offload/_root/data/findings/nested/cce-fortran-nested-allocatable-component-copy-fault.f90 +64 -0
  367. offload/_root/data/findings/nested/cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.f90 +93 -0
  368. offload/_root/data/findings/nested/cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.f90 +80 -0
  369. offload/_root/data/findings/nested/controls/c3-ctl-nested-data.c +27 -0
  370. offload/_root/data/findings/nested/controls/c5-acc-serial-struct-and-array.c +26 -0
  371. offload/_root/data/findings/nested/controls/e2-ctl-two-directives.c +42 -0
  372. offload/_root/data/findings/nested/controls/e3-ctl-attach-clause.c +42 -0
  373. offload/_root/data/findings/nested/controls/f3-pointer-array-only.c +33 -0
  374. offload/_root/data/findings/nested/controls/f5-ctl-copyout-exit.c +33 -0
  375. offload/_root/data/findings/nested/controls/f6-ctl-pointer-to-struct-array.c +28 -0
  376. offload/_root/data/findings/nested/controls/g2-ctl-allocatable.f90 +34 -0
  377. offload/_root/data/findings/nested/controls/g2-ctl-entered-to.f90 +34 -0
  378. offload/_root/data/findings/nested/controls/g3-ctl-from-struct-no-element.c +27 -0
  379. offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-to.c +27 -0
  380. offload/_root/data/findings/nested/controls/g3-ptrs-two-elements-tofrom.c +27 -0
  381. offload/_root/data/findings/nested/controls/g5-ctl-element-pointers-only.f90 +36 -0
  382. offload/_root/data/findings/nested/controls/g5-ctl-root-pointer-only.f90 +36 -0
  383. offload/_root/data/findings/nested/controls/gp2-ctl-no-mapper-explicit-maps.c +24 -0
  384. offload/_root/data/findings/nested/controls/gt2-ctl-no-always.c +26 -0
  385. offload/_root/data/findings/nested/controls/gt3-ctl-always-on-structure-only.c +26 -0
  386. offload/_root/data/findings/nested/controls/j1-embedded-struct-pointer-to-struct.c +24 -0
  387. offload/_root/data/findings/nested/controls/j2-ctl-pointer-instead-of-embedded.c +24 -0
  388. offload/_root/data/findings/nested/controls/j6-ctl-struct-and-one-pointee-level.c +23 -0
  389. offload/_root/data/findings/nested/controls/j7-ctl-struct-and-embedded-pointee.c +24 -0
  390. offload/_root/data/findings/nested/controls/m2-ctl-variable-root.f90 +32 -0
  391. offload/_root/data/findings/nested/controls/m3-ctl-fixed-array-component.f90 +32 -0
  392. offload/_root/data/findings/nested/controls/m5-ctl-no-enter-data.f90 +33 -0
  393. offload/_root/data/findings/nested/controls/n8-ctl-fixed-array-in-component.f90 +33 -0
  394. offload/_root/data/findings/nested/controls/n9-ctl-allocatable-in-the-variable.f90 +33 -0
  395. offload/_root/data/findings/nested/controls/ns4-ctl-two-directives-struct-then-pointee.c +27 -0
  396. offload/_root/data/findings/nested/controls/ns8-ctl-enter-together-exit-split.c +26 -0
  397. offload/_root/data/findings/nested/controls/nu3-ctl-update-pointee-only.c +28 -0
  398. offload/_root/data/findings/nested/controls/p2-ctl-pointer-variable.c +27 -0
  399. offload/_root/data/findings/nested/controls/p3-ctl-direct-member.c +26 -0
  400. offload/_root/data/findings/nested/controls/q2-ctl-fixed-array.f90 +37 -0
  401. offload/_root/data/findings/nested/controls/q3-ctl-allocatable-component-of-the-variable.f90 +38 -0
  402. offload/_root/data/findings/nested/controls/ta2-ctl-no-allocatable-component.f90 +42 -0
  403. offload/_root/data/findings/nested/controls/ta3-ctl-allocatable-scalar-in-the-variable.f90 +38 -0
  404. offload/_root/data/findings/nested/controls/ta4-ctl-pointer-component-only.f90 +42 -0
  405. offload/_root/data/findings/nested/controls/u3-ctl-update-member-only.c +24 -0
  406. offload/_root/data/findings/nested/controls/u4-ctl-two-updates.c +25 -0
  407. offload/_root/data/findings/nested/controls/u5-ctl-same-list-in-map.c +25 -0
  408. offload/_root/data/findings/nested/controls/ua2-ctl-variable-root.f90 +37 -0
  409. offload/_root/data/findings/nested/controls/ua4-ctl-to-in-place-of-alloc-and-update.f90 +37 -0
  410. offload/_root/data/findings/nested/controls/v2-ctl-parent-first.c +25 -0
  411. offload/_root/data/findings/nested/controls/v4-ctl-embedded-member.c +24 -0
  412. offload/_root/data/findings/nested/gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.c +83 -0
  413. offload/_root/data/findings/nested/gcc-acc-c-parent-and-shared-pointee-one-directive.c +88 -0
  414. offload/_root/data/findings/nested/gcc-acc-c-struct-and-member-array-one-directive.c +84 -0
  415. offload/_root/data/findings/nested/gcc-c-always-on-pointer-member-section-ice.c +75 -0
  416. offload/_root/data/findings/nested/gcc-c-declare-mapper-pointer-member-section-gpu-fault.c +93 -0
  417. offload/_root/data/findings/nested/gcc-c-from-struct-and-pointee-section-rejected.c +83 -0
  418. offload/_root/data/findings/nested/gcc-fortran-pointer-component-alloc-bounds-lost.f90 +62 -0
  419. offload/_root/data/findings/nested/gcc-fortran-root-and-element-pointer-components-ice.f90 +77 -0
  420. offload/_root/data/findings/nested/nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.c +55 -0
  421. offload/_root/data/findings/nested/nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.c +86 -0
  422. offload/_root/data/findings/nvhpc-acc-atomic-update-sum-fort2-crash.f90 +53 -0
  423. offload/_root/data/findings/nvhpc-c-acc-atomic-update-sum-ice.c +43 -0
  424. offload/_root/data/findings/nvhpc-c-dist-schedule-chunk-compile-hang.c +41 -0
  425. offload/_root/data/findings/nvhpc-c-map-present-ignored.c +42 -0
  426. offload/_root/data/findings/nvhpc-c-ordered-in-target-nvcpfe-crash.c +92 -0
  427. offload/_root/data/findings/nvhpc-c-parallel-for-firstprivate-in-target.c +62 -0
  428. offload/_root/data/findings/nvhpc-c-parallel-if-in-target-nvvm-ice.c +56 -0
  429. offload/_root/data/findings/nvhpc-defaultmap-firstprivate-explicit-map.f90 +45 -0
  430. offload/_root/data/findings/nvhpc-defaultmap-from-allocatable-indexing.f90 +60 -0
  431. offload/_root/data/findings/nvhpc-depend-inoutset-ignored.f90 +64 -0
  432. offload/_root/data/findings/nvhpc-dist-schedule-chunk-illegal-address.f90 +52 -0
  433. offload/_root/data/findings/nvhpc-managed-acc-shutdown-host-access.f90 +42 -0
  434. offload/_root/data/findings/nvhpc-parallel-if-in-target-nvvm-ice.f90 +60 -0
  435. offload/_root/data/findings/oop/afar-final-dealloc-device-link.f90 +85 -0
  436. offload/_root/data/findings/oop/afar-pdt-length-parameter-not-implemented.f90 +65 -0
  437. offload/_root/data/findings/oop/cce-class-is-device-link.f90 +86 -0
  438. offload/_root/data/findings/oop/cce-copy-alloc-component-section-fault.f90 +73 -0
  439. offload/_root/data/findings/oop/cce-copy-parent-to-component-tofrom-lost.f90 +65 -0
  440. offload/_root/data/findings/oop/cce-copy-second-member-section-lost.f90 +65 -0
  441. offload/_root/data/findings/oop/cce-element-component-map-lost.f90 +64 -0
  442. offload/_root/data/findings/oop/cce-final-dealloc-device-abort.f90 +85 -0
  443. offload/_root/data/findings/oop/cce-pdt-default-mapper-rejected.f90 +71 -0
  444. offload/_root/data/findings/oop/cce-polymorphic-dispatch-device-link.f90 +100 -0
  445. offload/_root/data/findings/oop/cce-section-of-element-component-overlap.f90 +76 -0
  446. offload/_root/data/findings/oop/cce-select-type-guard-not-taken.f90 +91 -0
  447. offload/_root/data/findings/oop/cce-udr-derived-type-unsupported.f90 +69 -0
  448. offload/_root/data/findings/oop/cce21-element-component-map-lost.f90 +62 -0
  449. offload/_root/data/findings/oop/controls/alloccomp-comp-only.f90 +44 -0
  450. offload/_root/data/findings/oop/controls/alloccomp-whole-explicit-component.f90 +50 -0
  451. offload/_root/data/findings/oop/controls/alloccomp-whole.f90 +49 -0
  452. offload/_root/data/findings/oop/controls/elemsec-element.f90 +47 -0
  453. offload/_root/data/findings/oop/controls/final-local.f90 +64 -0
  454. offload/_root/data/findings/oop/controls/host-class-star-select-type.f90 +58 -0
  455. offload/_root/data/findings/oop/controls/host-firstprivate-defined-assignment.f90 +54 -0
  456. offload/_root/data/findings/oop/controls/host-lastprivate-defined-assignment.f90 +58 -0
  457. offload/_root/data/findings/oop/controls/host-private-finalization.f90 +51 -0
  458. offload/_root/data/findings/oop/controls/host-select-type.f90 +65 -0
  459. offload/_root/data/findings/oop/controls/parent-and-comp-component-only.f90 +45 -0
  460. offload/_root/data/findings/oop/controls/pdt-kind.f90 +46 -0
  461. offload/_root/data/findings/oop/controls/pdt-len-host.f90 +43 -0
  462. offload/_root/data/findings/oop/controls/pdt-len-unparameterized.f90 +46 -0
  463. offload/_root/data/findings/oop/controls/poly-dispatch-static.f90 +75 -0
  464. offload/_root/data/findings/oop/controls/section-alloc-whole-component.f90 +49 -0
  465. offload/_root/data/findings/oop/controls/section-element-whole-array.f90 +50 -0
  466. offload/_root/data/findings/oop/controls/section-element-whole-component.f90 +50 -0
  467. offload/_root/data/findings/oop/controls/section-fixed.f90 +43 -0
  468. offload/_root/data/findings/oop/controls/tbp-override.f90 +64 -0
  469. offload/_root/data/findings/oop/gcc-acc-parent-and-member-data-rejected.f90 +63 -0
  470. offload/_root/data/findings/oop/gcc-pdt-length-parameter-abort.f90 +68 -0
  471. offload/_root/data/findings/oop/gcc-polymorphic-dispatch-abort.f90 +97 -0
  472. offload/_root/data/findings/oop/gcc-vtab-not-marked-for-offload.f90 +94 -0
  473. offload/_root/data/findings/oop/nvhpc-copy-alloc-component-illegal-address.f90 +76 -0
  474. offload/_root/data/findings/oop/nvhpc-copy-pdt-length-parameter-illegal-address.f90 +69 -0
  475. offload/_root/data/findings/oop/nvhpc-named-mapper-rejected.f90 +65 -0
  476. offload/_root/data/findings/oop/nvhpc-polymorphic-dispatch-translate-failure.f90 +90 -0
  477. offload/_root/data/findings/oop/nvhpc-polymorphism-runtime-unsupported.f90 +94 -0
  478. offload/_root/data/findings/oop/nvhpc-type-bound-call-rejected.f90 +89 -0
  479. offload/_root/data/findings/oop/nvhpc-udr-derived-type-rejected.f90 +67 -0
  480. offload/_root/data/findings/reviews/afar-c-error-directive-in-target-link.json +217 -0
  481. offload/_root/data/findings/reviews/afar-c-lastprivate-distribute-parallel-for-small-type.json +113 -0
  482. offload/_root/data/findings/reviews/afar-c-teams-distribute-reduction-first-team.json +130 -0
  483. offload/_root/data/findings/reviews/afar-c-update-iterator-copy-mode.json +113 -0
  484. offload/_root/data/findings/reviews/afar-cce19-character-defaultmap.json +292 -0
  485. offload/_root/data/findings/reviews/afar-clang-requires-device-safesync-hang.json +191 -0
  486. offload/_root/data/findings/reviews/afar-flang-firstprivate-map-two-targets.json +130 -0
  487. offload/_root/data/findings/reviews/afar-flang-loop-bind-teams-reduction.json +126 -0
  488. offload/_root/data/findings/reviews/afar-flang-task-reduction-max.json +113 -0
  489. offload/_root/data/findings/reviews/afar-flang-thread-limit-target-parallel-do.json +113 -0
  490. offload/_root/data/findings/reviews/afar-loop-bind-thread-in-teams.json +191 -0
  491. offload/_root/data/findings/reviews/afar-nontemporal-assumed-shape-ice.json +113 -0
  492. offload/_root/data/findings/reviews/afar-udr-derived-type-link.json +113 -0
  493. offload/_root/data/findings/reviews/afar-xnack1-atomic-min-nested-parallel.json +113 -0
  494. offload/_root/data/findings/reviews/afar-xnack1-target-is-present.json +113 -0
  495. offload/_root/data/findings/reviews/apps--afar-cce-teams-private-array-nested-parallel-wrong.json +113 -0
  496. offload/_root/data/findings/reviews/apps--cce20-device-link-infer-address-spaces-crash.json +113 -0
  497. offload/_root/data/findings/reviews/apps--cce21-device-link-agpr-copy-mfma-assert.json +113 -0
  498. offload/_root/data/findings/reviews/apps--cce21-private-array-loaded-subscript-wrong.json +113 -0
  499. offload/_root/data/findings/reviews/apps--gcc-acc-c-tile-partial-tiles-wrong.json +113 -0
  500. offload/_root/data/findings/reviews/catalog--afar-c-ordered-doacross-link.json +113 -0
  501. offload/_root/data/findings/reviews/catalog--afar-c-reduction-task-link.json +113 -0
  502. offload/_root/data/findings/reviews/catalog--afar-flang-absent-optional-target-crash.json +113 -0
  503. offload/_root/data/findings/reviews/catalog--afar-flang-critical-target-parallel-wrong.json +113 -0
  504. offload/_root/data/findings/reviews/catalog--afar-flang-dist-schedule-chunk.json +113 -0
  505. offload/_root/data/findings/reviews/catalog--afar-flang-linear-parallel-ice.json +113 -0
  506. offload/_root/data/findings/reviews/catalog--afar-flang-named-critical-link.json +126 -0
  507. offload/_root/data/findings/reviews/catalog--afar-flang-ordered-wrong.json +113 -0
  508. offload/_root/data/findings/reviews/catalog--afar-flang-reduction-minus-rejected.json +113 -0
  509. offload/_root/data/findings/reviews/catalog--afar-flang-sections-in-target-ice.json +113 -0
  510. offload/_root/data/findings/reviews/catalog--afar-flang-workdistribute-ice.json +113 -0
  511. offload/_root/data/findings/reviews/catalog--c-allocate-const-mem-firstprivate-wrong.json +113 -0
  512. offload/_root/data/findings/reviews/catalog--cce-acc-character-dummy-routine-ice.json +113 -0
  513. offload/_root/data/findings/reviews/catalog--cce-acc-loop-seq-in-routine-wrong.json +113 -0
  514. offload/_root/data/findings/reviews/catalog--cce-allocators-stack-ice.json +113 -0
  515. offload/_root/data/findings/reviews/catalog--cce-c-allocate-align-link.json +113 -0
  516. offload/_root/data/findings/reviews/catalog--cce-c-allocate-allocator-modifier-rejected.json +113 -0
  517. offload/_root/data/findings/reviews/catalog--cce-c-dist-schedule-chunk.json +113 -0
  518. offload/_root/data/findings/reviews/catalog--cce-c-f-pointer-device-link.json +130 -0
  519. offload/_root/data/findings/reviews/catalog--cce-c-long-double-ice.json +217 -0
  520. offload/_root/data/findings/reviews/catalog--cce-c-map-iterator-ice.json +217 -0
  521. offload/_root/data/findings/reviews/catalog--cce-c-recursive-function-ice.json +113 -0
  522. offload/_root/data/findings/reviews/catalog--cce-c-sections-in-target-wrong.json +113 -0
  523. offload/_root/data/findings/reviews/catalog--cce-flang-allocate-in-target-crash.json +113 -0
  524. offload/_root/data/findings/reviews/catalog--cce-flang-lastprivate-parallel-in-seq-loop-wrong.json +113 -0
  525. offload/_root/data/findings/reviews/catalog--cce-flang-stop-in-target-crash.json +113 -0
  526. offload/_root/data/findings/reviews/catalog--cce-iterator-link.json +113 -0
  527. offload/_root/data/findings/reviews/catalog--cce-linear-lastprivate-ice.json +113 -0
  528. offload/_root/data/findings/reviews/catalog--cce-reduction-inscan-ice.json +113 -0
  529. offload/_root/data/findings/reviews/catalog--cce-reduction-task-link.json +113 -0
  530. offload/_root/data/findings/reviews/catalog--cce19-reduction-task-addrspacecast-ice.json +113 -0
  531. offload/_root/data/findings/reviews/catalog--cce20-c-defaultmap-private-storage-rejected.json +217 -0
  532. offload/_root/data/findings/reviews/catalog--cce20-map-self-rejected.json +204 -0
  533. offload/_root/data/findings/reviews/catalog--cce21-c-target-loop-ice.json +126 -0
  534. offload/_root/data/findings/reviews/catalog--defaultmap-present-private-array-abort.json +236 -0
  535. offload/_root/data/findings/reviews/catalog--nvhpc-acc-associate-illegal-address.json +113 -0
  536. offload/_root/data/findings/reviews/catalog--nvhpc-c-function-pointer-kernel-missing.json +268 -0
  537. offload/_root/data/findings/reviews/cce-acc-init-set-runtime-assert.json +113 -0
  538. offload/_root/data/findings/reviews/cce-acc-reduction-200-int8-scalars-wrong.json +113 -0
  539. offload/_root/data/findings/reviews/cce-acc-routine-bind-module-ice.json +113 -0
  540. offload/_root/data/findings/reviews/cce-c-dist-schedule-segv.json +113 -0
  541. offload/_root/data/findings/reviews/cce-c-map-delete-refcount.json +149 -0
  542. offload/_root/data/findings/reviews/cce-c-map-present-assert.json +126 -0
  543. offload/_root/data/findings/reviews/cce-c-openmp45-device-link.json +113 -0
  544. offload/_root/data/findings/reviews/cce-c-parallel-for-in-target.json +141 -0
  545. offload/_root/data/findings/reviews/cce-mapper-next-map-copy-back.json +208 -0
  546. offload/_root/data/findings/reviews/cce-uses-allocators-traits-omp50.json +191 -0
  547. offload/_root/data/findings/reviews/cce19-c-reduction-63-scalars-one-wrong.json +113 -0
  548. offload/_root/data/findings/reviews/cce19-target-parallel-guarded-loop.json +113 -0
  549. offload/_root/data/findings/reviews/cce19-target-parallel-single-ice.json +113 -0
  550. offload/_root/data/findings/reviews/cce21-alloc-2e32-sum-wrong.json +113 -0
  551. offload/_root/data/findings/reviews/cce21-defaultmap-aggregate-flag.json +210 -0
  552. offload/_root/data/findings/reviews/cce21-in-reduction-assumed-shape-write-lost.json +113 -0
  553. offload/_root/data/findings/reviews/cce21-in-reduction-taskwait-link.json +113 -0
  554. offload/_root/data/findings/reviews/clang-c-declare-target-to-omp52.json +113 -0
  555. offload/_root/data/findings/reviews/clang-c-linear-directive-name-hang.json +113 -0
  556. offload/_root/data/findings/reviews/clang-c-shared-declare-target-combined.json +132 -0
  557. offload/_root/data/findings/reviews/dataenv--cce-value-dummy-target-write-visible.json +113 -0
  558. offload/_root/data/findings/reviews/defaultmap-none-loop-variable.json +113 -0
  559. offload/_root/data/findings/reviews/fortran-schedule-static-in-target.json +113 -0
  560. offload/_root/data/findings/reviews/fresh--cce-common-block-name-in-map-rejected.json +113 -0
  561. offload/_root/data/findings/reviews/fresh--cce-list-directed-print-in-target-copy-crash.json +217 -0
  562. offload/_root/data/findings/reviews/fresh--cce19-acc-automatic-array-copyout-copy-crash.json +113 -0
  563. offload/_root/data/findings/reviews/fresh--cce21-combined-if-runtime-expr-loop-skipped.json +113 -0
  564. offload/_root/data/findings/reviews/fresh--nvhpc-acc-gang-worker-collapse-nested-vector-reduction-lost.json +113 -0
  565. offload/_root/data/findings/reviews/fresh--nvhpc-teams-loop-module-allocatable-assign-fort2-crash.json +113 -0
  566. offload/_root/data/findings/reviews/fuzz--1505-cce20.json +113 -0
  567. offload/_root/data/findings/reviews/fuzz--1540-afar.json +113 -0
  568. offload/_root/data/findings/reviews/fuzz--1978-cce19.json +130 -0
  569. offload/_root/data/findings/reviews/fuzz--2334-cce19.json +113 -0
  570. offload/_root/data/findings/reviews/fuzz--591-cce19.json +147 -0
  571. offload/_root/data/findings/reviews/fuzz--650-afar.json +113 -0
  572. offload/_root/data/findings/reviews/fuzz--916-afar.json +130 -0
  573. offload/_root/data/findings/reviews/fuzz--98-cce19.json +113 -0
  574. offload/_root/data/findings/reviews/fuzz--b1-121-afar.json +160 -0
  575. offload/_root/data/findings/reviews/fuzz--b2-209-cce19.json +141 -0
  576. offload/_root/data/findings/reviews/fuzz--b2-68-afar.json +113 -0
  577. offload/_root/data/findings/reviews/fuzz--b2-85-cce20.json +217 -0
  578. offload/_root/data/findings/reviews/fuzz--b3-188-cce19.json +113 -0
  579. offload/_root/data/findings/reviews/fuzz--b3-278-cce19.json +212 -0
  580. offload/_root/data/findings/reviews/fuzz--b3-54-afar.json +113 -0
  581. offload/_root/data/findings/reviews/fuzz--b3-61-cce20.json +191 -0
  582. offload/_root/data/findings/reviews/fuzz--b4-86-cce19.json +113 -0
  583. offload/_root/data/findings/reviews/fuzz--gcc-declare-reduction-module-not-found.json +113 -0
  584. offload/_root/data/findings/reviews/fuzz--gcc-target-simd-map-nontemporal-rejected.json +113 -0
  585. offload/_root/data/findings/reviews/fuzz--nvhpc-allocatable-component-implicit-map-illegal-address.json +141 -0
  586. offload/_root/data/findings/reviews/fuzz--nvhpc-assumed-length-character-dummy-map-ice.json +113 -0
  587. offload/_root/data/findings/reviews/fuzz--nvhpc-default-none-reduction-lastprivate-fort1-crash.json +113 -0
  588. offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-firstprivate-lastprivate-ice.json +113 -0
  589. offload/_root/data/findings/reviews/fuzz--nvhpc-defaultmap-to-scalar-reduction-lost.json +113 -0
  590. offload/_root/data/findings/reviews/fuzz--nvhpc-depend-implicit-map-illegal-address.json +113 -0
  591. offload/_root/data/findings/reviews/fuzz--nvhpc-distribute-parallel-num-threads-writes-lost.json +113 -0
  592. offload/_root/data/findings/reviews/fuzz--nvhpc-end-distribute-simd-rejected.json +113 -0
  593. offload/_root/data/findings/reviews/fuzz--nvhpc-loop-character-achar-unsupported.json +113 -0
  594. offload/_root/data/findings/reviews/fuzz--nvhpc-map-always-after-map-to-not-copied-back.json +113 -0
  595. offload/_root/data/findings/reviews/fuzz--nvhpc-num-threads-reduction-identity-lost.json +113 -0
  596. offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-firstprivate-translate-failure.json +191 -0
  597. offload/_root/data/findings/reviews/fuzz--nvhpc-target-parallel-single-hang.json +113 -0
  598. offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-collapse-translate-failure.json +113 -0
  599. offload/_root/data/findings/reviews/fuzz--nvhpc-target-simd-no-end-directive-rejected.json +113 -0
  600. offload/_root/data/findings/reviews/fuzz--par-s1-2082-gcc_g90.json +126 -0
  601. offload/_root/data/findings/reviews/fuzz--s1-2370-cce21.json +113 -0
  602. offload/_root/data/findings/reviews/fuzz--s1-2592-cce21.json +113 -0
  603. offload/_root/data/findings/reviews/fuzz--s1-3463-cce21.json +113 -0
  604. offload/_root/data/findings/reviews/fuzz--s1-6760-cce20.json +130 -0
  605. offload/_root/data/findings/reviews/fuzz--s1-6888-cce21.json +113 -0
  606. offload/_root/data/findings/reviews/fuzz--s1-7882-cce20.json +113 -0
  607. offload/_root/data/findings/reviews/fuzz--s1-8634-cce21.json +113 -0
  608. offload/_root/data/findings/reviews/fuzz--s1-91-cce21.json +113 -0
  609. offload/_root/data/findings/reviews/fuzz--s1-9443-afar.json +113 -0
  610. offload/_root/data/findings/reviews/fuzz--s1-9914-cce19.json +141 -0
  611. offload/_root/data/findings/reviews/gcc--gcc-acc-bind-device-type-rejected.json +113 -0
  612. offload/_root/data/findings/reviews/gcc--gcc-acc-detach-delete-attach-underflow.json +314 -0
  613. offload/_root/data/findings/reviews/gcc--gcc-acc-gang-dim-collapse-force-rejected.json +113 -0
  614. offload/_root/data/findings/reviews/gcc--gcc-acc-init-set-shutdown-rejected.json +113 -0
  615. offload/_root/data/findings/reviews/gcc--gcc-acc-link-in-routine-rejected.json +113 -0
  616. offload/_root/data/findings/reviews/gcc--gcc-acc-use-device-allocatable-rejected.json +113 -0
  617. offload/_root/data/findings/reviews/gcc--gcc-c-motion-mapper-rejected.json +113 -0
  618. offload/_root/data/findings/reviews/gcc--gcc-c-omp60-undocumented-rejected.json +217 -0
  619. offload/_root/data/findings/reviews/gcc--gcc-c-omp60-unimplemented-rejected.json +236 -0
  620. offload/_root/data/findings/reviews/gcc--gcc-c-target-in-task-mandatory-device-not-found.json +236 -0
  621. offload/_root/data/findings/reviews/gcc--gcc-c-uses-allocators-traits-unimplemented.json +113 -0
  622. offload/_root/data/findings/reviews/gcc--gcc-declare-mapper-rejected.json +113 -0
  623. offload/_root/data/findings/reviews/gcc--gcc-defaultmap-to-pointer-copy-back.json +217 -0
  624. offload/_root/data/findings/reviews/gcc--gcc-loop-bind-default-none-rejected.json +113 -0
  625. offload/_root/data/findings/reviews/harvest--afar-flang-strided-target-update.json +141 -0
  626. offload/_root/data/findings/reviews/harvest--cce-acc-declare-create-module-allocatable-xnack1-fault.json +113 -0
  627. offload/_root/data/findings/reviews/harvest--cce-c-implicit-struct-map-partly-present.json +217 -0
  628. offload/_root/data/findings/reviews/harvest--cce-c-strided-target-update.json +141 -0
  629. offload/_root/data/findings/reviews/harvest--cce-ftn-target-parallel-thread-query-ice.json +130 -0
  630. offload/_root/data/findings/reviews/harvest--cce-named-constant-array-declare-target-routine-rejected.json +113 -0
  631. offload/_root/data/findings/reviews/harvest--cce-use-device-ptr-c-ptr-not-converted.json +113 -0
  632. offload/_root/data/findings/reviews/harvest--cce21-declare-target-link-module-variable-write-lost.json +113 -0
  633. offload/_root/data/findings/reviews/harvest--cce21-internal-procedure-calls-internal-in-target-fault.json +158 -0
  634. offload/_root/data/findings/reviews/harvest--gcc-acc-declare-create-allocatable-not-mapped.json +204 -0
  635. offload/_root/data/findings/reviews/harvest--gcc-c-same-item-two-maps-rejected.json +143 -0
  636. offload/_root/data/findings/reviews/harvest--gcc-c-strided-section-rejected.json +164 -0
  637. offload/_root/data/findings/reviews/harvest--gcc-c-target-data-struct-pointer-section-ice.json +113 -0
  638. offload/_root/data/findings/reviews/harvest--gcc-c-target-data-two-maps-ice.json +113 -0
  639. offload/_root/data/findings/reviews/harvest--gcc-teams-simd-matmul-allocatable-ice.json +113 -0
  640. offload/_root/data/findings/reviews/harvest--nvhpc-c-target-data-if-false-use-device-ptr-garbage.json +113 -0
  641. offload/_root/data/findings/reviews/harvest--nvhpc-named-constant-array-declare-target-routine-rejected.json +126 -0
  642. offload/_root/data/findings/reviews/harvest--nvhpc-use-device-ptr-c-ptr-not-found.json +113 -0
  643. offload/_root/data/findings/reviews/harvest--nvhpc2511-target-nowait-in-parallel-for-ice.json +130 -0
  644. offload/_root/data/findings/reviews/hecbench--gcc-c-float16-array-in-target-lto-ice.json +217 -0
  645. offload/_root/data/findings/reviews/hecbench--gcc-c-swar-popcount-assembler-error.json +126 -0
  646. offload/_root/data/findings/reviews/malloc--afar-device-malloc-in-kernel-corrupts-records.json +270 -0
  647. offload/_root/data/findings/reviews/multithread-allocatable-section-maps.json +191 -0
  648. offload/_root/data/findings/reviews/nested--afar-cce-c-call-result-member-in-target-rejected.json +113 -0
  649. offload/_root/data/findings/reviews/nested--afar-cce-c-update-struct-and-member-rejected.json +126 -0
  650. offload/_root/data/findings/reviews/nested--afar-flang-pointer-root-allocatable-component-enter-data-fault.json +191 -0
  651. offload/_root/data/findings/reviews/nested--cce-c-struct-and-nested-pointee-sections-ice.json +113 -0
  652. offload/_root/data/findings/reviews/nested--cce-fortran-nested-allocatable-component-copy-fault.json +214 -0
  653. offload/_root/data/findings/reviews/nested--cce-fortran-pointer-to-type-with-allocatable-scalar-component-typed-transfer.json +191 -0
  654. offload/_root/data/findings/reviews/nested--cce-fortran-update-to-pointer-root-allocatable-scalar-component-no-accelerator-object.json +297 -0
  655. offload/_root/data/findings/reviews/nested--gcc-acc-c-exit-data-of-a-pointer-array-element-target-hangs.json +204 -0
  656. offload/_root/data/findings/reviews/nested--gcc-acc-c-parent-and-shared-pointee-one-directive.json +130 -0
  657. offload/_root/data/findings/reviews/nested--gcc-acc-c-struct-and-member-array-one-directive.json +141 -0
  658. offload/_root/data/findings/reviews/nested--gcc-c-always-on-pointer-member-section-ice.json +113 -0
  659. offload/_root/data/findings/reviews/nested--gcc-c-declare-mapper-pointer-member-section-gpu-fault.json +113 -0
  660. offload/_root/data/findings/reviews/nested--gcc-c-from-struct-and-pointee-section-rejected.json +113 -0
  661. offload/_root/data/findings/reviews/nested--gcc-fortran-pointer-component-alloc-bounds-lost.json +217 -0
  662. offload/_root/data/findings/reviews/nested--gcc-fortran-root-and-element-pointer-components-ice.json +217 -0
  663. offload/_root/data/findings/reviews/nested--nvhpc-c-pointee-before-parent-in-one-map-list-copy-fault.json +204 -0
  664. offload/_root/data/findings/reviews/nested--nvhpc-c-update-from-structure-overwrites-attached-pointer-segv.json +191 -0
  665. offload/_root/data/findings/reviews/nvhpc-c-acc-atomic-update-sum-ice.json +277 -0
  666. offload/_root/data/findings/reviews/nvhpc-c-dist-schedule-chunk-compile-hang.json +113 -0
  667. offload/_root/data/findings/reviews/nvhpc-c-map-present-ignored.json +113 -0
  668. offload/_root/data/findings/reviews/nvhpc-c-ordered-in-target-nvcpfe-crash.json +113 -0
  669. offload/_root/data/findings/reviews/nvhpc-c-parallel-for-firstprivate-in-target.json +113 -0
  670. offload/_root/data/findings/reviews/nvhpc-defaultmap-firstprivate-explicit-map.json +113 -0
  671. offload/_root/data/findings/reviews/nvhpc-defaultmap-from-allocatable-indexing.json +132 -0
  672. offload/_root/data/findings/reviews/nvhpc-depend-inoutset-ignored.json +113 -0
  673. offload/_root/data/findings/reviews/nvhpc-dist-schedule-chunk-illegal-address.json +113 -0
  674. offload/_root/data/findings/reviews/nvhpc-managed-acc-shutdown-host-access.json +113 -0
  675. offload/_root/data/findings/reviews/nvhpc-parallel-if-in-target-nvvm-ice.json +113 -0
  676. offload/_root/data/findings/reviews/oop--afar-final-dealloc-device-link.json +132 -0
  677. offload/_root/data/findings/reviews/oop--afar-pdt-length-parameter-not-implemented.json +113 -0
  678. offload/_root/data/findings/reviews/oop--cce-class-is-device-link.json +130 -0
  679. offload/_root/data/findings/reviews/oop--cce-copy-alloc-component-section-fault.json +217 -0
  680. offload/_root/data/findings/reviews/oop--cce-copy-parent-to-component-tofrom-lost.json +217 -0
  681. offload/_root/data/findings/reviews/oop--cce-copy-second-member-section-lost.json +113 -0
  682. offload/_root/data/findings/reviews/oop--cce-element-component-map-lost.json +113 -0
  683. offload/_root/data/findings/reviews/oop--cce-final-dealloc-device-abort.json +208 -0
  684. offload/_root/data/findings/reviews/oop--cce-pdt-default-mapper-rejected.json +191 -0
  685. offload/_root/data/findings/reviews/oop--cce-polymorphic-dispatch-device-link.json +247 -0
  686. offload/_root/data/findings/reviews/oop--cce-section-of-element-component-overlap.json +113 -0
  687. offload/_root/data/findings/reviews/oop--cce-select-type-guard-not-taken.json +191 -0
  688. offload/_root/data/findings/reviews/oop--cce-udr-derived-type-unsupported.json +132 -0
  689. offload/_root/data/findings/reviews/oop--gcc-acc-parent-and-member-data-rejected.json +141 -0
  690. offload/_root/data/findings/reviews/oop--gcc-pdt-length-parameter-abort.json +141 -0
  691. offload/_root/data/findings/reviews/oop--gcc-polymorphic-dispatch-abort.json +217 -0
  692. offload/_root/data/findings/reviews/oop--gcc-vtab-not-marked-for-offload.json +113 -0
  693. offload/_root/data/findings/reviews/oop--nvhpc-copy-alloc-component-illegal-address.json +113 -0
  694. offload/_root/data/findings/reviews/oop--nvhpc-copy-pdt-length-parameter-illegal-address.json +236 -0
  695. offload/_root/data/findings/reviews/oop--nvhpc-named-mapper-rejected.json +113 -0
  696. offload/_root/data/findings/reviews/oop--nvhpc-polymorphic-dispatch-translate-failure.json +223 -0
  697. offload/_root/data/findings/reviews/oop--nvhpc-polymorphism-runtime-unsupported.json +126 -0
  698. offload/_root/data/findings/reviews/oop--nvhpc-type-bound-call-rejected.json +113 -0
  699. offload/_root/data/findings/reviews/oop--nvhpc-udr-derived-type-rejected.json +113 -0
  700. offload/_root/data/findings/reviews/stress--afar-c-lastprivate-combined-target-not-mapped.json +113 -0
  701. offload/_root/data/findings/reviews/stress--afar-target-scalar-implicit-firstprivate.json +175 -0
  702. offload/_root/data/findings/reviews/stress--cce-acc-declare-create-scalar-serial-firstprivate.json +113 -0
  703. offload/_root/data/findings/reviews/stress--cce-c-distribute-lastprivate-lost.json +113 -0
  704. offload/_root/data/findings/reviews/stress--cce-c-flto-offload-dropped.json +204 -0
  705. offload/_root/data/findings/reviews/stress--cce-ftn-cif-record-split-abort.json +113 -0
  706. offload/_root/data/findings/reviews/stress--cce-lastprivate-num-threads-collapse-simd.json +113 -0
  707. offload/_root/data/findings/reviews/stress--cce-teams-reduction-many-teams-wrap.json +113 -0
  708. offload/_root/data/findings/reviews/stress--cce21-declare-target-scalar-map-write-lost.json +113 -0
  709. offload/_root/data/findings/reviews/stress--gcc-declare-target-allocatable-component-ice.json +191 -0
  710. offload/_root/data/findings/reviews/stress--nvhpc-acc-derived-type-component-not-copied.json +126 -0
  711. offload/_root/data/findings/reviews/stress--nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.json +113 -0
  712. offload/_root/data/findings/reviews/stress--nvhpc-declare-target-scalar-write-lost.json +113 -0
  713. offload/_root/data/findings/reviews/stress--nvhpc-lastprivate-combined-target-not-mapped.json +113 -0
  714. offload/_root/data/findings/reviews/stress--nvhpc-target-scalar-implicit-firstprivate.json +130 -0
  715. offload/_root/data/findings/reviews/target-update-sections-in-parallel.json +113 -0
  716. offload/_root/data/findings/stress/afar-c-lastprivate-combined-target-not-mapped.c +72 -0
  717. offload/_root/data/findings/stress/afar-target-scalar-implicit-firstprivate.f90 +47 -0
  718. offload/_root/data/findings/stress/cce-acc-declare-create-scalar-serial-firstprivate.f90 +43 -0
  719. offload/_root/data/findings/stress/cce-c-distribute-lastprivate-lost.c +52 -0
  720. offload/_root/data/findings/stress/cce-c-flto-offload-dropped.c +73 -0
  721. offload/_root/data/findings/stress/cce-ftn-cif-record-split-abort.f90 +109 -0
  722. offload/_root/data/findings/stress/cce-lastprivate-num-threads-collapse-simd.f90 +66 -0
  723. offload/_root/data/findings/stress/cce-teams-reduction-many-teams-wrap.f90 +55 -0
  724. offload/_root/data/findings/stress/cce21-declare-target-scalar-map-write-lost.f90 +58 -0
  725. offload/_root/data/findings/stress/controls/gcc-declare-target-allocatable-component-control.f90 +29 -0
  726. offload/_root/data/findings/stress/gcc-declare-target-allocatable-component-ice.f90 +61 -0
  727. offload/_root/data/findings/stress/nvhpc-acc-derived-type-component-not-copied.f90 +33 -0
  728. offload/_root/data/findings/stress/nvhpc-c-lastprivate-teams-distribute-parallel-for-lost.c +62 -0
  729. offload/_root/data/findings/stress/nvhpc-declare-target-scalar-write-lost.f90 +43 -0
  730. offload/_root/data/findings/stress/nvhpc-lastprivate-combined-target-not-mapped.f90 +60 -0
  731. offload/_root/data/findings/stress/nvhpc-target-scalar-implicit-firstprivate.f90 +41 -0
  732. offload/_root/data/findings/target-update-sections-in-parallel.f90 +53 -0
  733. offload/_root/data/issues.json +1 -0
  734. offload/_root/data/search.json +1 -0
  735. offload/_root/data/vendor/checks/build.py +288 -0
  736. offload/_version.py +24 -0
  737. offload/canuse.py +88 -0
  738. offload/cli.py +52 -0
  739. offload/data.py +85 -0
  740. offload/engine/__init__.py +0 -0
  741. offload/engine/acc_c_gen.py +415 -0
  742. offload/engine/acc_gen.py +1104 -0
  743. offload/engine/acc_rules.py +656 -0
  744. offload/engine/apps.py +804 -0
  745. offload/engine/baseline.py +324 -0
  746. offload/engine/c_gen.py +883 -0
  747. offload/engine/c_program.py +913 -0
  748. offload/engine/c_rules.py +503 -0
  749. offload/engine/campaign.py +1180 -0
  750. offload/engine/campaigns/__init__.py +2 -0
  751. offload/engine/campaigns/hecbench.py +153 -0
  752. offload/engine/campaigns/nested.py +76 -0
  753. offload/engine/campaigns/oop.py +61 -0
  754. offload/engine/canary.py +275 -0
  755. offload/engine/catalog.py +860 -0
  756. offload/engine/citations.py +532 -0
  757. offload/engine/clang_oracle.py +208 -0
  758. offload/engine/combos.py +234 -0
  759. offload/engine/confirm/__init__.py +2 -0
  760. offload/engine/confirm/backlog.py +159 -0
  761. offload/engine/confirm/claims.py +423 -0
  762. offload/engine/confirm/collectors.py +665 -0
  763. offload/engine/confirm/decisions.py +202 -0
  764. offload/engine/confirm/draft.py +195 -0
  765. offload/engine/confirm/engine.py +157 -0
  766. offload/engine/confirm/execute.py +382 -0
  767. offload/engine/confirm/facts.py +467 -0
  768. offload/engine/confirm/findings.py +617 -0
  769. offload/engine/confirm/forms.py +145 -0
  770. offload/engine/confirm/ingest.py +372 -0
  771. offload/engine/confirm/jobs.py +215 -0
  772. offload/engine/confirm/legality.py +323 -0
  773. offload/engine/confirm/machines.py +254 -0
  774. offload/engine/confirm/minimize.py +268 -0
  775. offload/engine/confirm/model.py +249 -0
  776. offload/engine/confirm/ports.py +107 -0
  777. offload/engine/confirm/programs.py +222 -0
  778. offload/engine/confirm/registry.py +151 -0
  779. offload/engine/confirm/regress.py +278 -0
  780. offload/engine/confirm/rules.py +565 -0
  781. offload/engine/confirm/store.py +63 -0
  782. offload/engine/confirm/triage.py +838 -0
  783. offload/engine/confirm/validate.py +607 -0
  784. offload/engine/confirm/witness.py +355 -0
  785. offload/engine/corpus_check.py +388 -0
  786. offload/engine/coverage.py +318 -0
  787. offload/engine/dataenv_gen.py +1318 -0
  788. offload/engine/dataenv_rules.py +278 -0
  789. offload/engine/devtemps.py +146 -0
  790. offload/engine/expected.py +2559 -0
  791. offload/engine/f2c.py +1783 -0
  792. offload/engine/finding_claims.py +330 -0
  793. offload/engine/finding_header.py +229 -0
  794. offload/engine/finding_rows.py +382 -0
  795. offload/engine/flang_oracle.py +299 -0
  796. offload/engine/fsource.py +620 -0
  797. offload/engine/fuzz.py +2455 -0
  798. offload/engine/fuzz_base.py +2016 -0
  799. offload/engine/fuzz_campaign.py +592 -0
  800. offload/engine/fuzz_exec.py +798 -0
  801. offload/engine/fuzz_min.py +1049 -0
  802. offload/engine/fuzz_profile.py +340 -0
  803. offload/engine/fuzz_report.py +1270 -0
  804. offload/engine/fuzz_steer.py +181 -0
  805. offload/engine/gate.py +1013 -0
  806. offload/engine/gate_report.py +711 -0
  807. offload/engine/gate_run.py +118 -0
  808. offload/engine/gate_stored.py +466 -0
  809. offload/engine/gen.py +1114 -0
  810. offload/engine/gen_templates.py +2583 -0
  811. offload/engine/grammar.py +695 -0
  812. offload/engine/harness.py +1472 -0
  813. offload/engine/harvest/__init__.py +3 -0
  814. offload/engine/harvest/c_runtime.py +465 -0
  815. offload/engine/harvest/checks.py +534 -0
  816. offload/engine/harvest/convert.py +784 -0
  817. offload/engine/harvest/f_runtime.py +668 -0
  818. offload/engine/harvest/filters.py +338 -0
  819. offload/engine/harvest/history.py +122 -0
  820. offload/engine/harvest/inventory.py +399 -0
  821. offload/engine/harvest2/__init__.py +5 -0
  822. offload/engine/harvest2/aomp.py +119 -0
  823. offload/engine/harvest2/examples.py +116 -0
  824. offload/engine/harvest2/gomp.py +679 -0
  825. offload/engine/harvest2/hand.py +150 -0
  826. offload/engine/harvest2/split.py +78 -0
  827. offload/engine/harvest_known/__init__.py +2 -0
  828. offload/engine/harvest_known/apps.py +65 -0
  829. offload/engine/harvest_known/cases.py +128 -0
  830. offload/engine/harvest_known/centres.py +184 -0
  831. offload/engine/harvest_known/forum.py +180 -0
  832. offload/engine/harvest_known/relnotes.py +42 -0
  833. offload/engine/harvest_known/textscan.py +107 -0
  834. offload/engine/hdrwrap.py +42 -0
  835. offload/engine/hecbench.py +568 -0
  836. offload/engine/hecbench_report.py +265 -0
  837. offload/engine/hecbench_run.py +483 -0
  838. offload/engine/idioms.py +1427 -0
  839. offload/engine/kbody_cites.py +81 -0
  840. offload/engine/kbody_emit.py +949 -0
  841. offload/engine/kbody_gen.py +795 -0
  842. offload/engine/legality_review.py +236 -0
  843. offload/engine/localcfg.py +58 -0
  844. offload/engine/malloc_dd.py +267 -0
  845. offload/engine/mutate.py +1933 -0
  846. offload/engine/nested_cites.py +196 -0
  847. offload/engine/nested_emit.py +789 -0
  848. offload/engine/nested_gen.py +1721 -0
  849. offload/engine/offload_scope.py +197 -0
  850. offload/engine/ompvv.py +624 -0
  851. offload/engine/oop_gen.py +2249 -0
  852. offload/engine/prerun.py +1435 -0
  853. offload/engine/program_source.py +739 -0
  854. offload/engine/provenance.py +103 -0
  855. offload/engine/reduce.py +2098 -0
  856. offload/engine/report.py +3374 -0
  857. offload/engine/root.py +33 -0
  858. offload/engine/rules.py +4256 -0
  859. offload/engine/run_matrix.py +325 -0
  860. offload/engine/site/__init__.py +1 -0
  861. offload/engine/site/columns.py +53 -0
  862. offload/engine/site/data.py +648 -0
  863. offload/engine/site/header.py +228 -0
  864. offload/engine/site/inputs.py +115 -0
  865. offload/engine/site/matrix.py +434 -0
  866. offload/engine/site/scrub.py +294 -0
  867. offload/engine/skeleton.py +121 -0
  868. offload/engine/spec_text.py +242 -0
  869. offload/engine/stress.py +4122 -0
  870. offload/engine/stress_c.py +1000 -0
  871. offload/engine/stress_exec.py +805 -0
  872. offload/engine/stress_min.py +248 -0
  873. offload/engine/stress_report.py +552 -0
  874. offload/engine/textclean.py +97 -0
  875. offload/engine/toolchains.py +1070 -0
  876. offload/engine/transforms.py +511 -0
  877. offload/engine/usage.py +1252 -0
  878. offload/engine/widen.py +673 -0
  879. offload/engine/widen_progs.py +2396 -0
  880. offload/issues.py +146 -0
  881. offtarget-0.1.0.dist-info/METADATA +86 -0
  882. offtarget-0.1.0.dist-info/RECORD +886 -0
  883. offtarget-0.1.0.dist-info/WHEEL +4 -0
  884. offtarget-0.1.0.dist-info/entry_points.txt +2 -0
  885. offtarget-0.1.0.dist-info/licenses/LICENSE +21 -0
  886. offtarget-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +20 -0
@@ -0,0 +1,2249 @@
1
+ """fortran-oop: program families of Fortran derived types and object-oriented
2
+ features in device code.
3
+
4
+ Each family is a set of small, self-checking, free-form Fortran programs
5
+ (OpenMP 5.2, or OpenACC 3.4 for the ``acc-`` families). A program prints
6
+ ``name= value`` lines and the harness's ``RESULT ran_on_host=<0|1>
7
+ check=<pass|fail>`` line. Expected values are computed here in Python from
8
+ the program's arithmetic and written into its checks and header.
9
+ ``legality`` is ``defined`` (the program must pass both legality witnesses,
10
+ offload.engine.prerun) or ``unspecified`` (the spec leaves the behaviour
11
+ unspecified or OpenACC 3.4 does not address it; a failure is an
12
+ observation, not a finding; ``why`` cites the text). Expected values hold in
13
+ both memory modes unless ``modes`` says otherwise.
14
+ ``programs()`` lists every program, ``program(id)`` returns one, and
15
+ ``Program.harness()`` is the offload.engine.gen.Program the harness runs."""
16
+ from __future__ import annotations
17
+
18
+ import re
19
+ import textwrap
20
+ from dataclasses import dataclass, field
21
+
22
+ N = 64
23
+ S1 = N * (N + 1) // 2 # sum 1..n
24
+ S2 = N * (N + 1) * (2 * N + 1) // 6 # sum of squares 1..n
25
+
26
+
27
+ @dataclass(frozen=True)
28
+ class Program:
29
+ id: str
30
+ family: str
31
+ variant: str
32
+ title: str
33
+ model: str # "omp" | "acc"
34
+ version: int # 52 | 34
35
+ source: str
36
+ expected: dict
37
+ legality: str # "defined" | "unspecified"
38
+ cites: tuple
39
+ why: str = ""
40
+ modes: tuple = ("copy", "unified")
41
+ lang: str = "f90"
42
+
43
+ @property
44
+ def text(self) -> str: # offload.engine.prerun reads .text or .source
45
+ return self.source
46
+
47
+ def harness(self):
48
+ """The offload.engine.gen.Program the harness runs."""
49
+ from offload.engine.gen import Program as HP
50
+ return HP(id=self.id, lang="f90", source=self.source,
51
+ atoms=frozenset({f"oop.{self.family}"}),
52
+ primary_atom=f"oop.{self.family}", legal=True,
53
+ violates=None, observable=True, model=self.model)
54
+
55
+
56
+ @dataclass
57
+ class V:
58
+ """One variant under construction."""
59
+ family: str
60
+ variant: str
61
+ title: str
62
+ cites: list
63
+ types: str = ""
64
+ mod_decls: str = ""
65
+ procs: str = ""
66
+ decls: str = ""
67
+ body: str = ""
68
+ checks: list = field(default_factory=list) # (name, expected int)
69
+ legality: str = "defined"
70
+ why: str = ""
71
+ model: str = "omp"
72
+ modes: tuple = ("copy", "unified")
73
+
74
+
75
+ _OPEN = re.compile(r"^(?:do\b|if\s*\(.*\)\s*then$|select\s+type\b|"
76
+ r"(?:abstract\s+)?interface\b|module\s+(?!procedure)\w+$|"
77
+ r"type\s*(?:,[^:]*)?::|type\s+(?!is\b)\w+$|"
78
+ r"(?:[\w(),=*]+\s+)*?(?:subroutine|function)\s+\w+)",
79
+ re.I)
80
+ _MIDDLE = re.compile(r"^(?:else\b|type\s+is\b|class\s+is\b|"
81
+ r"class\s+default\b|contains$)", re.I)
82
+ _CLOSE = re.compile(r"^end\b", re.I)
83
+
84
+
85
+ def _block(text: str, indent: int) -> list[str]:
86
+ """The statements of `text`, re-indented by nesting (two blanks per
87
+ level, directives at the level of the code around them)."""
88
+ out, level, in_select = [], 0, []
89
+ for raw in text.split("\n"):
90
+ ln = raw.strip()
91
+ if not ln:
92
+ continue
93
+ if _CLOSE.match(ln):
94
+ if re.match(r"^end\s*select", ln, re.I) and in_select:
95
+ level -= 1
96
+ in_select.pop()
97
+ level -= 1
98
+ out.append(" " * (indent + 2 * max(level, 0)) + ln)
99
+ continue
100
+ if _MIDDLE.match(ln):
101
+ if re.match(r"^(?:type|class)\s+(?:is|default)", ln, re.I):
102
+ if in_select and in_select[-1]:
103
+ level -= 1
104
+ elif in_select:
105
+ in_select[-1] = True
106
+ out.append(" " * (indent + 2 * level) + ln)
107
+ level += 1
108
+ continue
109
+ out.append(" " * (indent + 2 * max(level - 1, 0)) + ln)
110
+ continue
111
+ out.append(" " * (indent + 2 * level) + ln)
112
+ if _OPEN.match(ln) and not ln.lower().startswith("!"):
113
+ level += 1
114
+ if re.match(r"^select\s+type", ln, re.I):
115
+ in_select.append(False)
116
+ return out
117
+
118
+
119
+ def _wrap(prefix: str, text: str) -> list[str]:
120
+ lines = textwrap.wrap(text, 96, break_long_words=False,
121
+ break_on_hyphens=False)
122
+ return [f"! {prefix}{lines[0]}"] + [f"! {ln}" for ln in lines[1:]]
123
+
124
+
125
+ def render(v: V) -> Program:
126
+ acc = v.model == "acc"
127
+ pid = f"oop-{v.family}-{v.variant}"
128
+ head = [f"! fortran-oop {v.family}/{v.variant} "
129
+ f"({'OpenACC 3.4' if acc else 'OpenMP 5.2'}, free-form Fortran):"]
130
+ head += _wrap("", v.title)
131
+ head += _wrap("spec: ", "; ".join(v.cites))
132
+ head += _wrap("legality: ", v.legality + (f": {v.why}" if v.why else ""))
133
+ head += _wrap("expected (computed by compliance/oop_gen.py): ",
134
+ ", ".join(f"{k}= {x}" for k, x in v.checks))
135
+ mod = ["module oop_m", " implicit none", f" integer, parameter :: n = {N}"]
136
+ mod += _block(v.types, 2) + _block(v.mod_decls, 2)
137
+ procs = _block(v.procs, 2)
138
+ if procs:
139
+ mod += ["contains"] + procs
140
+ mod += ["end module oop_m"]
141
+ main = ["program oop", f" use {'openacc' if acc else 'omp_lib'}",
142
+ " use oop_m", " implicit none", " integer :: host_flag",
143
+ " logical :: ok"]
144
+ names = {k for k, _ in v.checks}
145
+ declared = "\n".join(ln for ln in v.decls.split("\n")
146
+ if "::" in ln).lower()
147
+ missing = [k for k in sorted(names)
148
+ if not re.search(rf"\b{k}\b", declared)]
149
+ if missing:
150
+ main += [f" integer :: {', '.join(missing)}"]
151
+ main += _block(v.decls, 2)
152
+ main += [" host_flag = 1"]
153
+ if acc:
154
+ main += [" !$acc serial copy(host_flag)",
155
+ " host_flag = merge(1, 0, acc_on_device(acc_device_host))",
156
+ " !$acc end serial"]
157
+ else:
158
+ main += [" !$omp target map(from: host_flag)",
159
+ " host_flag = merge(1, 0, omp_is_initial_device())",
160
+ " !$omp end target"]
161
+ main += _block(v.body, 2)
162
+ main += [" ok = .true."]
163
+ main += [f" ok = ok .and. ({k} == {x})" for k, x in v.checks]
164
+ main += [f" print '(a,i0)', '{k}= ', {k}" for k, _ in v.checks]
165
+ main += [" print '(a,i0,a,a)', 'RESULT ran_on_host=', host_flag, "
166
+ "' check=', merge('pass', 'fail', ok)", "end program oop"]
167
+ src = "\n".join(head + mod + [""] + main) + "\n"
168
+ too_long = [ln for ln in src.split("\n") if len(ln) > 132]
169
+ if too_long:
170
+ raise ValueError(f"{pid}: line over 132 characters: {too_long[0]}")
171
+ return Program(id=pid, family=v.family, variant=v.variant,
172
+ title=v.title, model=v.model,
173
+ version=34 if acc else 52, source=src,
174
+ expected=dict(v.checks), legality=v.legality,
175
+ cites=tuple(v.cites), why=v.why, modes=v.modes)
176
+
177
+
178
+ # --- shared pieces --------------------------------------------------------------------
179
+
180
+ VEC = """
181
+ type vec
182
+ integer :: n = 0
183
+ integer, allocatable :: a(:)
184
+ end type vec
185
+ """
186
+
187
+ VEC_SETUP = """
188
+ allocate(x%a(n))
189
+ x%n = n
190
+ do i = 1, n
191
+ x%a(i) = i
192
+ end do
193
+ """
194
+
195
+ C_MAPPABLE = "OpenMP 5.2 §1.2.6 p.18-19 (mappable type)"
196
+ C_MAP = "OpenMP 5.2 §5.8.3 p.151-155 (map clause)"
197
+ C_DEFMAPPER = "OpenMP 5.2 §5.8.2 p.150 (predefined default mapper)"
198
+ C_ALLOCCOMP = ("OpenMP 5.2 §5.8.3 p.151 l.29-37 (components from the "
199
+ "predefined default mapper); OpenMP 6.0 §B.5 p.909 l.35-37 "
200
+ "(5.0: mapping of allocatable and pointer components)")
201
+ C_ARRAYELTS = ("OpenMP 6.0 §7.9.6 p.281 l.25-26 (array elements become "
202
+ "implicit list items)")
203
+ C_IMPLICIT = ("OpenMP 5.2 §5.8.1 p.148 (implicit data-mapping: a "
204
+ "non-scalar is tofrom); §1.2.6 (scalar: intrinsic type)")
205
+ C_STRUCTELT = ("OpenMP 5.2 §13.8 p.286 l.27-28 (other referenced elements "
206
+ "of a mapped structure element are mapped too)")
207
+ C_TBP = ("OpenMP 5.2 §1.2.6 p.19 l.1-3 (type-bound procedures accessed in "
208
+ "a target region appear in a declare target directive)")
209
+ C_DT = "OpenMP 5.2 §7.8.1 p.205-207 (declare target, procedures)"
210
+ C_PROCREF = "OpenMP 5.2 §13.8 p.285 l.1-3 (procedures referenced in target)"
211
+ C_UPDATE = "OpenMP 5.2 §13.9 (target update)"
212
+ C_ENTER = "OpenMP 5.2 §13.6, §13.7 (target enter data, target exit data)"
213
+ C_MAPPER = "OpenMP 5.2 §5.8.8 p.162-164 (declare mapper)"
214
+ C_SECTION = ("OpenMP 5.2 §5.8.3 p.151 l.13 (structure elements and array "
215
+ "sections are list items); §5.8.3 p.157 l.21-22")
216
+ C_POLY60 = ("OpenMP 6.0 §7.9.6 p.288 l.10 (Fortran: a map list item of "
217
+ "polymorphic type: the behavior is unspecified)")
218
+ C_FINAL = ("OpenMP 5.2 §5.3 p.107 l.20-22 (finalization of a privatized "
219
+ "list item at the end of the region)")
220
+
221
+
222
+ # --- F01 nested types and arrays of types ---------------------------------------------
223
+
224
+ def _nested() -> list[V]:
225
+ out = []
226
+ types = """
227
+ type inner
228
+ integer :: a = 0, b = 0
229
+ end type inner
230
+ type outer
231
+ type(inner) :: in
232
+ integer :: c = 0
233
+ integer :: arr(4) = 0
234
+ end type outer
235
+ """
236
+ setup = """
237
+ o%in%a = 3
238
+ o%in%b = 5
239
+ o%c = 7
240
+ o%arr = [1, 2, 3, 4]
241
+ """
242
+ region = """
243
+ o%c = o%in%a * 10 + o%in%b + o%arr(1) + o%arr(2) + o%arr(3) + o%arr(4)
244
+ o%in%a = o%in%a + o%arr(4)
245
+ """
246
+ tail = "r1 = o%c\nr2 = o%in%a\n"
247
+ r1 = 3 * 10 + 5 + 1 + 2 + 3 + 4
248
+ out.append(V("nested", "whole", "a structure with a nested structure and "
249
+ "a fixed-size array component, map(tofrom:) whole",
250
+ [C_MAP, C_DEFMAPPER], types=types,
251
+ decls="type(outer) :: o",
252
+ body=setup + "!$omp target map(tofrom: o)\n" + region +
253
+ "!$omp end target\n" + tail,
254
+ checks=[("r1", r1), ("r2", 3 + 4)]))
255
+ out.append(V("nested", "implicit", "the same structure referenced in a "
256
+ "target region without a map clause (implicitly tofrom)",
257
+ [C_IMPLICIT, C_DEFMAPPER], types=types,
258
+ decls="type(outer) :: o",
259
+ body=setup + "!$omp target\n" + region + "!$omp end target\n"
260
+ + tail, checks=[("r1", r1), ("r2", 7)]))
261
+ out.append(V("nested", "aos", "an array of structures in a target teams "
262
+ "distribute parallel do",
263
+ [C_MAP, C_ARRAYELTS],
264
+ types="type pt\n integer :: x = 0, y = 0\nend type pt",
265
+ decls="type(pt) :: p(n)\ninteger :: i",
266
+ body="""
267
+ do i = 1, n
268
+ p(i)%x = i
269
+ p(i)%y = 2 * i
270
+ end do
271
+ !$omp target teams distribute parallel do map(tofrom: p)
272
+ do i = 1, n
273
+ p(i)%x = p(i)%x + 3 * p(i)%y
274
+ end do
275
+ r1 = sum(p%x)
276
+ r2 = p(n)%x
277
+ """, checks=[("r1", 7 * S1), ("r2", 7 * N)]))
278
+ out.append(V("nested", "cells", "a structure whose component is an array "
279
+ "of structures with array components, with a reduction",
280
+ [C_MAP, "OpenMP 5.2 §17.2 p.341 l.11-13 (a reduction on a "
281
+ "combined target construct maps tofrom)"],
282
+ types="""
283
+ type cell
284
+ integer :: v(3) = 0
285
+ end type cell
286
+ type grid
287
+ type(cell) :: c(n)
288
+ integer :: total = 0
289
+ end type grid
290
+ """, decls="type(grid) :: g\ninteger :: i, tot",
291
+ body="""
292
+ do i = 1, n
293
+ g%c(i)%v = [i, 2 * i, 3 * i]
294
+ end do
295
+ tot = 0
296
+ !$omp target teams distribute parallel do map(tofrom: g) reduction(+: tot)
297
+ do i = 1, n
298
+ g%c(i)%v(2) = g%c(i)%v(1) + g%c(i)%v(3)
299
+ tot = tot + g%c(i)%v(2)
300
+ end do
301
+ r1 = tot
302
+ r2 = g%c(5)%v(2)
303
+ """, checks=[("r1", 4 * S1), ("r2", 20)]))
304
+ out.append(V("nested", "enterexit", "an array of structures by target "
305
+ "enter data, updated on the device, target update from, "
306
+ "exit data", [C_ENTER, C_UPDATE, C_MAP],
307
+ types="type pt\n integer :: x = 0, y = 0\nend type pt",
308
+ decls="type(pt) :: p(n)\ninteger :: i",
309
+ body="""
310
+ do i = 1, n
311
+ p(i)%x = i
312
+ p(i)%y = 0
313
+ end do
314
+ !$omp target enter data map(to: p)
315
+ !$omp target teams distribute parallel do
316
+ do i = 1, n
317
+ p(i)%x = 2 * p(i)%x
318
+ p(i)%y = i
319
+ end do
320
+ !$omp target update from(p)
321
+ r1 = sum(p%x)
322
+ r2 = sum(p%y)
323
+ !$omp target exit data map(release: p)
324
+ """, checks=[("r1", 2 * S1), ("r2", S1)]))
325
+ return out
326
+
327
+
328
+ # --- F02 allocatable components (deep copy) -------------------------------------------
329
+
330
+ def _alloccomp() -> list[V]:
331
+ out = []
332
+ d = "type(vec) :: x\ninteger :: i"
333
+ out.append(V("alloccomp", "whole", "map(tofrom:) of a structure with an "
334
+ "allocatable array component: the component's data is mapped "
335
+ "with it (deep copy)", [C_ALLOCCOMP, C_DEFMAPPER],
336
+ types=VEC, decls=d, body=VEC_SETUP + """
337
+ !$omp target teams distribute parallel do map(tofrom: x)
338
+ do i = 1, n
339
+ x%a(i) = 3 * x%a(i) + x%n
340
+ end do
341
+ r1 = sum(x%a)
342
+ r2 = x%a(n)
343
+ """, checks=[("r1", 3 * S1 + N * N), ("r2", 3 * N + N)]))
344
+ out.append(V("alloccomp", "parent-and-comp", "map(to:) of the structure "
345
+ "and map(tofrom:) of its allocatable component on one "
346
+ "construct", [C_MAP, C_ALLOCCOMP,
347
+ "OpenMP 5.2 §5.8.3 p.156 l.6-7"],
348
+ types=VEC, decls=d, body=VEC_SETUP + """
349
+ !$omp target teams distribute parallel do map(to: x) map(tofrom: x%a)
350
+ do i = 1, n
351
+ x%a(i) = x%a(i) + 7
352
+ end do
353
+ r1 = sum(x%a)
354
+ """, checks=[("r1", S1 + 7 * N)]))
355
+ out.append(V("alloccomp", "comp-only", "map(tofrom:) of the allocatable "
356
+ "component alone", [C_MAP, C_STRUCTELT],
357
+ types=VEC, decls=d, body=VEC_SETUP + """
358
+ !$omp target teams distribute parallel do map(tofrom: x%a)
359
+ do i = 1, n
360
+ x%a(i) = 2 * x%a(i)
361
+ end do
362
+ r1 = sum(x%a)
363
+ """, checks=[("r1", 2 * S1)]))
364
+ out.append(V("alloccomp", "enterexit", "target enter data of the "
365
+ "structure (deep copy), a target region with an implicit map, "
366
+ "target exit data map(from:)", [C_ENTER, C_ALLOCCOMP],
367
+ types=VEC, decls=d, body=VEC_SETUP + """
368
+ !$omp target enter data map(to: x)
369
+ !$omp target teams distribute parallel do
370
+ do i = 1, n
371
+ x%a(i) = 5 * x%a(i)
372
+ end do
373
+ !$omp target exit data map(from: x)
374
+ r1 = sum(x%a)
375
+ """, checks=[("r1", 5 * S1)]))
376
+ out.append(V("alloccomp", "array", "an array of structures, each with an "
377
+ "allocatable component, mapped whole",
378
+ [C_ALLOCCOMP, C_ARRAYELTS], types=VEC,
379
+ decls="type(vec) :: v(4)\ninteger :: i, k",
380
+ body="""
381
+ do k = 1, 4
382
+ allocate(v(k)%a(n))
383
+ v(k)%n = n
384
+ do i = 1, n
385
+ v(k)%a(i) = k * i
386
+ end do
387
+ end do
388
+ !$omp target teams distribute parallel do collapse(2) map(tofrom: v)
389
+ do k = 1, 4
390
+ do i = 1, n
391
+ v(k)%a(i) = v(k)%a(i) + k
392
+ end do
393
+ end do
394
+ r1 = 0
395
+ do k = 1, 4
396
+ r1 = r1 + sum(v(k)%a)
397
+ end do
398
+ """, checks=[("r1", 10 * (S1 + N))]))
399
+ out.append(V("alloccomp", "twolevel", "an allocatable array of structures "
400
+ "with allocatable components inside a structure (two levels "
401
+ "of deep copy)", [C_ALLOCCOMP, C_ARRAYELTS],
402
+ types="""
403
+ type inner
404
+ integer, allocatable :: b(:)
405
+ end type inner
406
+ type outer
407
+ type(inner), allocatable :: c(:)
408
+ integer :: m = 0
409
+ end type outer
410
+ """, decls="type(outer) :: o\ninteger :: i, j",
411
+ body="""
412
+ allocate(o%c(3))
413
+ o%m = 3
414
+ do j = 1, 3
415
+ allocate(o%c(j)%b(n))
416
+ do i = 1, n
417
+ o%c(j)%b(i) = 100 * j + i
418
+ end do
419
+ end do
420
+ !$omp target teams distribute parallel do collapse(2) map(tofrom: o)
421
+ do j = 1, 3
422
+ do i = 1, n
423
+ o%c(j)%b(i) = 2 * o%c(j)%b(i)
424
+ end do
425
+ end do
426
+ r1 = 0
427
+ do j = 1, 3
428
+ r1 = r1 + sum(o%c(j)%b)
429
+ end do
430
+ """, checks=[("r1", 2 * (600 * N + 3 * S1))]))
431
+ out.append(V("alloccomp", "scalar", "an allocatable scalar component",
432
+ [C_ALLOCCOMP],
433
+ types="""
434
+ type sc
435
+ integer, allocatable :: s
436
+ integer :: k = 0
437
+ end type sc
438
+ """, decls="type(sc) :: x",
439
+ body="""
440
+ allocate(x%s)
441
+ x%s = 5
442
+ x%k = 3
443
+ !$omp target map(tofrom: x)
444
+ x%s = x%s * 10 + x%k
445
+ !$omp end target
446
+ r1 = x%s
447
+ """, checks=[("r1", 53)]))
448
+ out.append(V("alloccomp", "update", "target update from(x%a) of an "
449
+ "allocatable component of a structure entered by target "
450
+ "enter data", [C_UPDATE, C_ALLOCCOMP, C_ENTER],
451
+ types=VEC, decls=d, body=VEC_SETUP + """
452
+ !$omp target enter data map(to: x)
453
+ !$omp target teams distribute parallel do
454
+ do i = 1, n
455
+ x%a(i) = -x%a(i)
456
+ end do
457
+ !$omp target update from(x%a)
458
+ r1 = sum(x%a)
459
+ !$omp target exit data map(release: x)
460
+ """, checks=[("r1", -S1)]))
461
+ return out
462
+
463
+
464
+ # --- F03 pointer components -----------------------------------------------------------
465
+
466
+ PV = """
467
+ type pv
468
+ integer :: n = 0
469
+ integer, pointer :: p(:) => null()
470
+ end type pv
471
+ """
472
+
473
+
474
+ def _ptrcomp() -> list[V]:
475
+ out = []
476
+ d = "type(pv) :: x\ninteger, target :: buf(n)\ninteger :: i"
477
+ setup = "do i = 1, n\n buf(i) = i\nend do\nx%n = n\nx%p => buf\n"
478
+ out.append(V("ptrcomp", "parent-and-comp", "map(to:) of a structure and "
479
+ "map(tofrom:) of its pointer component: the target is mapped "
480
+ "and the device pointer attached",
481
+ [C_MAP, "OpenMP 5.2 §5.8.3 p.152 l.1-16 (pointer list items, "
482
+ "attached pointers)"], types=PV, decls=d,
483
+ body=setup + """
484
+ !$omp target teams distribute parallel do map(to: x) map(tofrom: x%p)
485
+ do i = 1, n
486
+ x%p(i) = x%p(i) + 100
487
+ end do
488
+ r1 = sum(buf)
489
+ r2 = buf(n)
490
+ """, checks=[("r1", S1 + 100 * N), ("r2", N + 100)]))
491
+ out.append(V("ptrcomp", "comp-only", "map(tofrom:) of a pointer "
492
+ "component alone", [C_MAP, C_STRUCTELT], types=PV, decls=d,
493
+ body=setup + """
494
+ !$omp target teams distribute parallel do map(tofrom: x%p)
495
+ do i = 1, n
496
+ x%p(i) = 2 * x%p(i)
497
+ end do
498
+ r1 = sum(buf)
499
+ """, checks=[("r1", 2 * S1)]))
500
+ out.append(V("ptrcomp", "enterexit", "target enter data of the structure, "
501
+ "then of its pointer component (attach), a target region, exit "
502
+ "data from the component, release of the structure",
503
+ [C_ENTER, "OpenMP 5.2 §5.8.3 p.152 l.5-16",
504
+ "OpenMP 5.2 §5.8.3 p.156 l.27-30"], types=PV, decls=d,
505
+ body=setup + """
506
+ !$omp target enter data map(to: x)
507
+ !$omp target enter data map(to: x%p)
508
+ !$omp target teams distribute parallel do
509
+ do i = 1, n
510
+ x%p(i) = 3 * x%p(i)
511
+ end do
512
+ !$omp target exit data map(from: x%p)
513
+ !$omp target exit data map(release: x)
514
+ r1 = sum(buf)
515
+ """, checks=[("r1", 3 * S1)]))
516
+ out.append(V("ptrcomp", "section-target", "a pointer component associated "
517
+ "with an array section buf(9:24), map(tofrom: x%p)",
518
+ [C_MAP, "OpenMP 5.2 §5.8.3 p.152 l.1-4"], types=PV, decls=d,
519
+ body="""
520
+ do i = 1, n
521
+ buf(i) = i
522
+ end do
523
+ x%n = 16
524
+ x%p => buf(9:24)
525
+ !$omp target teams distribute parallel do map(tofrom: x%p)
526
+ do i = 1, 16
527
+ x%p(i) = x%p(i) + 1000
528
+ end do
529
+ r1 = sum(buf)
530
+ r2 = buf(9)
531
+ """, checks=[("r1", S1 + 16000), ("r2", 1009)]))
532
+ return out
533
+
534
+
535
+ # --- F04 sections of components -------------------------------------------------------
536
+
537
+ def _section() -> list[V]:
538
+ out = []
539
+ d = "type(vec) :: x\ninteger :: i"
540
+ out.append(V("section", "alloc", "map(tofrom: x%a(9:40)): a section of an "
541
+ "allocatable component", [C_SECTION, C_STRUCTELT],
542
+ types=VEC, decls=d, body=VEC_SETUP + """
543
+ !$omp target teams distribute parallel do map(tofrom: x%a(9:40))
544
+ do i = 9, 40
545
+ x%a(i) = x%a(i) + 1000
546
+ end do
547
+ r1 = sum(x%a)
548
+ r2 = x%a(8)
549
+ """, checks=[("r1", S1 + 32000), ("r2", 8)]))
550
+ out.append(V("section", "fixed", "map(tofrom: s%b(17:48)): a section of a "
551
+ "fixed-size array component", [C_SECTION, C_STRUCTELT],
552
+ types="type fs\n integer :: b(n) = 0\n integer :: k = 0\n"
553
+ "end type fs", decls="type(fs) :: s\ninteger :: i",
554
+ body="""
555
+ do i = 1, n
556
+ s%b(i) = i
557
+ end do
558
+ !$omp target teams distribute parallel do map(tofrom: s%b(17:48))
559
+ do i = 17, 48
560
+ s%b(i) = 2 * s%b(i)
561
+ end do
562
+ r1 = sum(s%b)
563
+ """, checks=[("r1", S1 + sum(range(17, 49)))]))
564
+ out.append(V("section", "update", "target update from(x%a(1:16)) after "
565
+ "the device changed every element, then exit data from",
566
+ [C_UPDATE, C_SECTION, C_ENTER], types=VEC, decls=d,
567
+ body=VEC_SETUP + """
568
+ !$omp target enter data map(to: x)
569
+ !$omp target teams distribute parallel do
570
+ do i = 1, n
571
+ x%a(i) = 2 * x%a(i)
572
+ end do
573
+ !$omp target update from(x%a(1:16))
574
+ r1 = sum(x%a(1:16))
575
+ !$omp target exit data map(from: x)
576
+ r2 = sum(x%a)
577
+ """, checks=[("r1", 2 * 136), ("r2", 2 * S1)]))
578
+ out.append(V("section", "element", "map(tofrom: v(2)%a(5:20)): a section "
579
+ "of the allocatable component of an array element",
580
+ [C_SECTION], types=VEC,
581
+ decls="type(vec) :: v(3)\ninteger :: i, k",
582
+ body="""
583
+ do k = 1, 3
584
+ allocate(v(k)%a(n))
585
+ v(k)%n = n
586
+ do i = 1, n
587
+ v(k)%a(i) = i
588
+ end do
589
+ end do
590
+ !$omp target teams distribute parallel do map(tofrom: v(2)%a(5:20))
591
+ do i = 5, 20
592
+ v(2)%a(i) = v(2)%a(i) + 50
593
+ end do
594
+ r1 = sum(v(2)%a)
595
+ r2 = sum(v(1)%a)
596
+ """, checks=[("r1", S1 + 16 * 50), ("r2", S1)]))
597
+ out.append(V("section", "nested", "map(tofrom: o%in%v(3:30)): a section of "
598
+ "an allocatable component of a nested structure", [C_SECTION],
599
+ types="""
600
+ type in_t
601
+ integer, allocatable :: v(:)
602
+ end type in_t
603
+ type out_t
604
+ type(in_t) :: in
605
+ integer :: tag = 0
606
+ end type out_t
607
+ """, decls="type(out_t) :: o\ninteger :: i",
608
+ body="""
609
+ allocate(o%in%v(n))
610
+ do i = 1, n
611
+ o%in%v(i) = i
612
+ end do
613
+ !$omp target teams distribute parallel do map(tofrom: o%in%v(3:30))
614
+ do i = 3, 30
615
+ o%in%v(i) = 3 * o%in%v(i)
616
+ end do
617
+ r1 = sum(o%in%v)
618
+ """, checks=[("r1", S1 + 2 * sum(range(3, 31)))]))
619
+ return out
620
+
621
+
622
+ # --- F05 declare mapper ----------------------------------------------------------------
623
+
624
+ MAPPER = "!$omp declare mapper(vec :: v) map(tofrom: v, v%a(1:v%n))"
625
+
626
+
627
+ def _mapper() -> list[V]:
628
+ out = []
629
+ d = "type(vec) :: x\ninteger :: i"
630
+ out.append(V("mapper", "default", "a default user-defined mapper for a "
631
+ "type with an allocatable component", [C_MAPPER, C_MAP],
632
+ types=VEC + MAPPER, decls=d, body=VEC_SETUP + """
633
+ !$omp target teams distribute parallel do map(tofrom: x)
634
+ do i = 1, n
635
+ x%a(i) = x%a(i) + i
636
+ end do
637
+ r1 = sum(x%a)
638
+ """, checks=[("r1", 2 * S1)]))
639
+ out.append(V("mapper", "named", "a named mapper used by "
640
+ "map(mapper(deep), tofrom: x)", [C_MAPPER,
641
+ "OpenMP 5.2 §5.8.2"],
642
+ types=VEC + "!$omp declare mapper(deep: vec :: v) "
643
+ "map(tofrom: v, v%a(1:v%n))", decls=d,
644
+ body=VEC_SETUP + """
645
+ !$omp target teams distribute parallel do map(mapper(deep), tofrom: x)
646
+ do i = 1, n
647
+ x%a(i) = x%a(i) * x%n
648
+ end do
649
+ r1 = sum(x%a)
650
+ """, checks=[("r1", N * S1)]))
651
+ out.append(V("mapper", "array", "an array of structures mapped through "
652
+ "the default user-defined mapper (each element by the mapper)",
653
+ [C_MAPPER, "OpenMP 5.2 §5.8.3 p.151 l.26-28"],
654
+ types=VEC + MAPPER, decls="type(vec) :: v(3)\ninteger :: i, k",
655
+ body="""
656
+ do k = 1, 3
657
+ allocate(v(k)%a(n))
658
+ v(k)%n = n
659
+ do i = 1, n
660
+ v(k)%a(i) = i
661
+ end do
662
+ end do
663
+ !$omp target teams distribute parallel do collapse(2) map(tofrom: v)
664
+ do k = 1, 3
665
+ do i = 1, n
666
+ v(k)%a(i) = v(k)%a(i) + k
667
+ end do
668
+ end do
669
+ r1 = sum(v(1)%a) + sum(v(2)%a) + sum(v(3)%a)
670
+ """, checks=[("r1", 3 * S1 + 6 * N)]))
671
+ out.append(V("mapper", "update", "target update from(x) through the "
672
+ "default user-defined mapper (the component's data comes "
673
+ "back)", [C_MAPPER, C_UPDATE,
674
+ "OpenMP 5.2 §5.9 p.165-166 (motion clauses use "
675
+ "mappers)"],
676
+ types=VEC + MAPPER, decls=d, body=VEC_SETUP + """
677
+ !$omp target enter data map(to: x)
678
+ !$omp target teams distribute parallel do
679
+ do i = 1, n
680
+ x%a(i) = x%a(i) + 5
681
+ end do
682
+ !$omp target update from(x)
683
+ r1 = sum(x%a)
684
+ !$omp target exit data map(release: x)
685
+ """, checks=[("r1", S1 + 5 * N)]))
686
+ out.append(V("mapper", "implicit", "a structure referenced in a target "
687
+ "region without a map clause: the implicit map uses the "
688
+ "default user-defined mapper", [C_MAPPER, C_IMPLICIT,
689
+ C_MAP],
690
+ types=VEC + MAPPER, decls=d, body=VEC_SETUP + """
691
+ !$omp target teams distribute parallel do
692
+ do i = 1, n
693
+ x%a(i) = 3 * x%a(i)
694
+ end do
695
+ r1 = sum(x%a)
696
+ """, checks=[("r1", 3 * S1)]))
697
+ out.append(V("mapper", "chained", "a mapper of an outer type whose map of "
698
+ "an inner component uses the inner type's mapper",
699
+ [C_MAPPER, "OpenMP 5.2 §5.8.8 p.164 l.1-2 (mapper map "
700
+ "clauses are subject to mappers in scope)"],
701
+ types="""
702
+ type inner_t
703
+ integer :: m = 0
704
+ integer, allocatable :: b(:)
705
+ end type inner_t
706
+ type outer_t
707
+ type(inner_t) :: in
708
+ integer :: k = 0
709
+ end type outer_t
710
+ !$omp declare mapper(inner_t :: w) map(tofrom: w, w%b(1:w%m))
711
+ !$omp declare mapper(outer_t :: o) map(tofrom: o, o%in)
712
+ """, decls="type(outer_t) :: o\ninteger :: i",
713
+ body="""
714
+ allocate(o%in%b(n))
715
+ o%in%m = n
716
+ o%k = 10
717
+ do i = 1, n
718
+ o%in%b(i) = i
719
+ end do
720
+ !$omp target teams distribute parallel do map(tofrom: o)
721
+ do i = 1, n
722
+ o%in%b(i) = o%in%b(i) + o%k
723
+ end do
724
+ r1 = sum(o%in%b)
725
+ """, checks=[("r1", S1 + 10 * N)]))
726
+ return out
727
+
728
+
729
+ # --- F06 parameterized derived types ---------------------------------------------------
730
+
731
+ LV = """
732
+ type lv(m)
733
+ integer, len :: m
734
+ integer :: a(m)
735
+ end type lv
736
+ """
737
+
738
+
739
+ def _pdt() -> list[V]:
740
+ out = []
741
+ out.append(V("pdt", "kind", "a derived type with a kind type parameter "
742
+ "(integer(8) components), map(tofrom:)",
743
+ [C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7 (same type, type "
744
+ "parameters and rank)"],
745
+ types="""
746
+ type kv(k)
747
+ integer, kind :: k = 4
748
+ integer(k) :: v(8)
749
+ end type kv
750
+ """, decls="type(kv(8)) :: x\ninteger :: i",
751
+ body="""
752
+ do i = 1, 8
753
+ x%v(i) = int(i, 8) * 1000000000_8
754
+ end do
755
+ !$omp target map(tofrom: x)
756
+ do i = 1, 8
757
+ x%v(i) = x%v(i) + i
758
+ end do
759
+ !$omp end target
760
+ r1 = int(x%v(8) - 8000000000_8)
761
+ r2 = int(mod(sum(x%v), 1000000_8))
762
+ """, checks=[("r1", 8), ("r2", 36)]))
763
+ out.append(V("pdt", "len", "a derived type with a length type parameter "
764
+ "(constant), its value read on the device",
765
+ [C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7"], types=LV,
766
+ decls="type(lv(16)) :: x\ninteger :: i",
767
+ body="""
768
+ do i = 1, 16
769
+ x%a(i) = i
770
+ end do
771
+ !$omp target map(tofrom: x) map(from: r1)
772
+ r1 = x%m
773
+ do i = 1, x%m
774
+ x%a(i) = x%a(i) * x%a(i)
775
+ end do
776
+ !$omp end target
777
+ r2 = sum(x%a)
778
+ """, checks=[("r1", 16),
779
+ ("r2", sum(i * i for i in range(1, 17)))]))
780
+ out.append(V("pdt", "deferred", "an allocatable scalar of a derived type "
781
+ "with a deferred length type parameter (allocate(lv(32) :: y))",
782
+ [C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7"], types=LV,
783
+ decls="type(lv(:)), allocatable :: y\ninteger :: i",
784
+ body="""
785
+ allocate(lv(32) :: y)
786
+ do i = 1, 32
787
+ y%a(i) = i
788
+ end do
789
+ !$omp target map(tofrom: y)
790
+ do i = 1, 32
791
+ y%a(i) = y%a(i) + y%m
792
+ end do
793
+ !$omp end target
794
+ r1 = sum(y%a)
795
+ """, checks=[("r1", 528 + 32 * 32)]))
796
+ out.append(V("pdt", "array", "an array of a parameterized derived type in "
797
+ "a target teams distribute parallel do", [C_MAP, C_ARRAYELTS],
798
+ types=LV, decls="type(lv(4)) :: arr(n)\ninteger :: i, j",
799
+ body="""
800
+ do j = 1, n
801
+ arr(j)%a = j
802
+ end do
803
+ !$omp target teams distribute parallel do collapse(2) map(tofrom: arr)
804
+ do j = 1, n
805
+ do i = 1, 4
806
+ arr(j)%a(i) = arr(j)%a(i) + i
807
+ end do
808
+ end do
809
+ r1 = 0
810
+ do j = 1, n
811
+ r1 = r1 + sum(arr(j)%a)
812
+ end do
813
+ """, checks=[("r1", 4 * S1 + 10 * N)]))
814
+ out.append(V("pdt", "kindlen", "a derived type with a kind and a length "
815
+ "type parameter", [C_MAP, "OpenMP 5.2 §5.8.3 p.155 l.5-7"],
816
+ types="""
817
+ type kl(k, m)
818
+ integer, kind :: k = 4
819
+ integer, len :: m
820
+ integer(k) :: a(m)
821
+ end type kl
822
+ """, decls="type(kl(8, 10)) :: x\ninteger :: i",
823
+ body="""
824
+ do i = 1, 10
825
+ x%a(i) = i
826
+ end do
827
+ !$omp target map(tofrom: x)
828
+ do i = 1, x%m
829
+ x%a(i) = 2 * x%a(i) + 1
830
+ end do
831
+ !$omp end target
832
+ r1 = int(sum(x%a))
833
+ """, checks=[("r1", 2 * 55 + 10)]))
834
+ return out
835
+
836
+
837
+ # --- F07 type extension ----------------------------------------------------------------
838
+
839
+ BASE_EXT = """
840
+ type base
841
+ integer :: a = 0
842
+ end type base
843
+ type, extends(base) :: ext
844
+ integer :: b = 0
845
+ end type ext
846
+ """
847
+
848
+
849
+ def _extends() -> list[V]:
850
+ out = []
851
+ out.append(V("extends", "whole", "an extended type mapped whole: "
852
+ "inherited and own components, and the parent component",
853
+ [C_MAP, C_DEFMAPPER], types=BASE_EXT, decls="type(ext) :: e",
854
+ body="""
855
+ e%a = 5
856
+ e%b = 7
857
+ !$omp target map(tofrom: e)
858
+ e%b = e%a * 2 + e%b
859
+ e%a = e%a + 1
860
+ e%base%a = e%base%a + 10
861
+ !$omp end target
862
+ r1 = e%a
863
+ r2 = e%b
864
+ """, checks=[("r1", 16), ("r2", 17)]))
865
+ out.append(V("extends", "parent-comp", "map(tofrom: e%base): the parent "
866
+ "component as a structure element", [C_MAP, C_STRUCTELT],
867
+ types=BASE_EXT, decls="type(ext) :: e",
868
+ body="""
869
+ e%a = 5
870
+ e%b = 7
871
+ !$omp target map(tofrom: e%base)
872
+ e%base%a = e%base%a * 3
873
+ !$omp end target
874
+ r1 = e%a
875
+ r2 = e%b
876
+ """, checks=[("r1", 15), ("r2", 7)]))
877
+ out.append(V("extends", "alloc-parent", "an array of an extended type "
878
+ "whose parent has an allocatable component",
879
+ [C_ALLOCCOMP, C_ARRAYELTS],
880
+ types="""
881
+ type base2
882
+ integer, allocatable :: w(:)
883
+ end type base2
884
+ type, extends(base2) :: ext2
885
+ integer :: s = 0
886
+ end type ext2
887
+ """, decls="type(ext2) :: arr(4)\ninteger :: i, k",
888
+ body="""
889
+ do k = 1, 4
890
+ allocate(arr(k)%w(n))
891
+ arr(k)%w = k
892
+ arr(k)%s = 0
893
+ end do
894
+ !$omp target teams distribute parallel do map(tofrom: arr)
895
+ do k = 1, 4
896
+ do i = 1, n
897
+ arr(k)%w(i) = arr(k)%w(i) + i
898
+ arr(k)%s = arr(k)%s + arr(k)%w(i)
899
+ end do
900
+ end do
901
+ r1 = sum(arr%s)
902
+ r2 = arr(4)%w(n)
903
+ """, checks=[("r1", N * 10 + 4 * S1), ("r2", 4 + N)]))
904
+ out.append(V("extends", "chain", "a three-level extension chain: "
905
+ "components by inherited names and by parent components",
906
+ [C_MAP], types="""
907
+ type lvl1
908
+ integer :: a = 0
909
+ end type lvl1
910
+ type, extends(lvl1) :: lvl2
911
+ integer :: b = 0
912
+ end type lvl2
913
+ type, extends(lvl2) :: lvl3
914
+ integer :: c = 0
915
+ end type lvl3
916
+ """, decls="type(lvl3) :: t",
917
+ body="""
918
+ t%a = 1
919
+ t%b = 2
920
+ t%c = 3
921
+ !$omp target map(tofrom: t)
922
+ t%c = t%a + t%b + t%c
923
+ t%lvl2%lvl1%a = 10
924
+ t%lvl2%b = t%b * 4
925
+ !$omp end target
926
+ r1 = t%a
927
+ r2 = t%b
928
+ r3 = t%c
929
+ """, checks=[("r1", 10), ("r2", 8), ("r3", 6)]))
930
+ out.append(V("extends", "aos", "an array of an extended type in a target "
931
+ "teams distribute parallel do", [C_MAP, C_ARRAYELTS],
932
+ types=BASE_EXT, decls="type(ext) :: q(n)\ninteger :: i",
933
+ body="""
934
+ do i = 1, n
935
+ q(i)%a = i
936
+ q(i)%b = 0
937
+ end do
938
+ !$omp target teams distribute parallel do map(tofrom: q)
939
+ do i = 1, n
940
+ q(i)%b = q(i)%a * q(i)%a
941
+ q(i)%a = -q(i)%a
942
+ end do
943
+ r1 = sum(q%b)
944
+ r2 = sum(q%a)
945
+ """, checks=[("r1", S2), ("r2", -S1)]))
946
+ return out
947
+
948
+
949
+ # --- F08 type-bound procedures as device routines --------------------------------------
950
+
951
+ def _tbp() -> list[V]:
952
+ out = []
953
+ dt = "!$omp declare target"
954
+ vec3 = f"""
955
+ type vec3
956
+ integer :: x = 0, y = 0, z = 0
957
+ contains
958
+ procedure :: norm2 => v_norm2
959
+ procedure, nopass :: twice => v_twice
960
+ procedure :: scale_i, scale_ij
961
+ generic :: scale => scale_i, scale_ij
962
+ end type vec3
963
+ """
964
+ vprocs = f"""
965
+ integer function v_norm2(s)
966
+ {dt}
967
+ class(vec3), intent(in) :: s
968
+ v_norm2 = s%x * s%x + s%y * s%y + s%z * s%z
969
+ end function v_norm2
970
+ integer function v_twice(k)
971
+ {dt}
972
+ integer, intent(in) :: k
973
+ v_twice = 2 * k
974
+ end function v_twice
975
+ subroutine scale_i(s, k)
976
+ {dt}
977
+ class(vec3), intent(inout) :: s
978
+ integer, intent(in) :: k
979
+ s%x = s%x * k
980
+ s%y = s%y * k
981
+ s%z = s%z * k
982
+ end subroutine scale_i
983
+ subroutine scale_ij(s, a, b)
984
+ {dt}
985
+ class(vec3), intent(inout) :: s
986
+ integer, intent(in) :: a, b
987
+ s%x = s%x * a * b
988
+ s%y = s%y * a * b
989
+ s%z = s%z * a * b
990
+ end subroutine scale_ij
991
+ """
992
+ vset = "v%x = 1\nv%y = 2\nv%z = 3\n"
993
+ out.append(V("tbp", "function", "a type-bound function called on the "
994
+ "device (declare target)", [C_TBP, C_DT], types=vec3,
995
+ procs=vprocs, decls="type(vec3) :: v",
996
+ body=vset + "!$omp target map(tofrom: v) map(from: r1)\n"
997
+ "r1 = v%norm2()\n!$omp end target\n",
998
+ checks=[("r1", 14)]))
999
+ out.append(V("tbp", "nopass", "a NOPASS type-bound function called on the "
1000
+ "device", [C_TBP, C_DT], types=vec3, procs=vprocs,
1001
+ decls="type(vec3) :: v",
1002
+ body=vset + "!$omp target map(tofrom: v) map(from: r1)\n"
1003
+ "r1 = v%twice(21)\n!$omp end target\n",
1004
+ checks=[("r1", 42)]))
1005
+ out.append(V("tbp", "generic", "a generic type-bound binding with two "
1006
+ "specific subroutines, both called on the device",
1007
+ [C_TBP, C_DT], types=vec3, procs=vprocs,
1008
+ decls="type(vec3) :: v",
1009
+ body=vset + """
1010
+ !$omp target map(tofrom: v)
1011
+ call v%scale(3)
1012
+ call v%scale(2, 5)
1013
+ !$omp end target
1014
+ r1 = v%x + v%y + v%z
1015
+ """, checks=[("r1", (1 + 2 + 3) * 30)]))
1016
+ ov_types = """
1017
+ type base_t
1018
+ integer :: a = 0
1019
+ contains
1020
+ procedure :: val => base_val
1021
+ end type base_t
1022
+ type, extends(base_t) :: ext_t
1023
+ integer :: b = 0
1024
+ contains
1025
+ procedure :: val => ext_val
1026
+ end type ext_t
1027
+ """
1028
+ ov_procs = f"""
1029
+ integer function base_val(s)
1030
+ {dt}
1031
+ class(base_t), intent(in) :: s
1032
+ base_val = s%a
1033
+ end function base_val
1034
+ integer function ext_val(s)
1035
+ {dt}
1036
+ class(ext_t), intent(in) :: s
1037
+ ext_val = s%a * 100 + s%b
1038
+ end function ext_val
1039
+ """
1040
+ out.append(V("tbp", "override", "an overridden binding called on objects "
1041
+ "of the base and the extended type, and through the parent "
1042
+ "component", [C_TBP, C_DT], types=ov_types, procs=ov_procs,
1043
+ decls="type(base_t) :: b0\ntype(ext_t) :: e",
1044
+ body="""
1045
+ b0%a = 3
1046
+ e%a = 4
1047
+ e%b = 5
1048
+ !$omp target map(tofrom: b0, e) map(from: r1, r2, r3)
1049
+ r1 = b0%val()
1050
+ r2 = e%val()
1051
+ r3 = e%base_t%val()
1052
+ !$omp end target
1053
+ """, checks=[("r1", 3), ("r2", 405), ("r3", 4)]))
1054
+ out.append(V("tbp", "loop", "a type-bound subroutine called on each "
1055
+ "element of an array in a target teams distribute parallel do",
1056
+ [C_TBP, C_DT],
1057
+ types="""
1058
+ type cnt
1059
+ integer :: c = 0
1060
+ contains
1061
+ procedure :: step => cnt_step
1062
+ end type cnt
1063
+ """, procs=f"""
1064
+ subroutine cnt_step(s, k)
1065
+ {dt}
1066
+ class(cnt), intent(inout) :: s
1067
+ integer, intent(in) :: k
1068
+ s%c = s%c + k
1069
+ end subroutine cnt_step
1070
+ """, decls="type(cnt) :: p(n)\ninteger :: i",
1071
+ body="""
1072
+ !$omp target teams distribute parallel do map(tofrom: p)
1073
+ do i = 1, n
1074
+ call p(i)%step(i)
1075
+ call p(i)%step(1)
1076
+ end do
1077
+ r1 = sum(p%c)
1078
+ """, checks=[("r1", S1 + N)]))
1079
+ out.append(V("tbp", "argument", "a type-bound function with a second "
1080
+ "derived-type argument", [C_TBP, C_DT],
1081
+ types="""
1082
+ type acc_t
1083
+ integer :: v(8) = 0
1084
+ contains
1085
+ procedure :: dot => a_dot
1086
+ end type acc_t
1087
+ """, procs=f"""
1088
+ integer function a_dot(s, o)
1089
+ {dt}
1090
+ class(acc_t), intent(in) :: s
1091
+ type(acc_t), intent(in) :: o
1092
+ integer :: i
1093
+ a_dot = 0
1094
+ do i = 1, 8
1095
+ a_dot = a_dot + s%v(i) * o%v(i)
1096
+ end do
1097
+ end function a_dot
1098
+ """, decls="type(acc_t) :: u, w\ninteger :: i",
1099
+ body="""
1100
+ do i = 1, 8
1101
+ u%v(i) = i
1102
+ w%v(i) = 2
1103
+ end do
1104
+ !$omp target map(tofrom: u, w) map(from: r1)
1105
+ r1 = u%dot(w)
1106
+ !$omp end target
1107
+ """, checks=[("r1", 72)]))
1108
+ out.append(V("tbp", "operator", "a type-bound generic operator(+) used in "
1109
+ "device code", [C_TBP, C_DT],
1110
+ types="""
1111
+ type v2
1112
+ integer :: x = 0, y = 0
1113
+ contains
1114
+ procedure :: add => v2_add
1115
+ generic :: operator(+) => add
1116
+ end type v2
1117
+ """, procs=f"""
1118
+ function v2_add(a, b) result(c)
1119
+ {dt}
1120
+ class(v2), intent(in) :: a
1121
+ type(v2), intent(in) :: b
1122
+ type(v2) :: c
1123
+ c%x = a%x + b%x
1124
+ c%y = a%y + b%y
1125
+ end function v2_add
1126
+ """, decls="type(v2) :: a, b, c",
1127
+ body="""
1128
+ a%x = 1
1129
+ a%y = 2
1130
+ b%x = 10
1131
+ b%y = 20
1132
+ !$omp target map(tofrom: a, b, c)
1133
+ c = a + b
1134
+ !$omp end target
1135
+ r1 = c%x * 100 + c%y
1136
+ """, checks=[("r1", 1122)]))
1137
+ out.append(V("tbp", "nested-call", "a type-bound function that calls "
1138
+ "another binding of the same object", [C_TBP, C_DT],
1139
+ types="""
1140
+ type pair
1141
+ integer :: v(2) = 0
1142
+ contains
1143
+ procedure :: part => p_part
1144
+ procedure :: total => p_total
1145
+ end type pair
1146
+ """, procs=f"""
1147
+ integer function p_part(s, k)
1148
+ {dt}
1149
+ class(pair), intent(in) :: s
1150
+ integer, intent(in) :: k
1151
+ p_part = s%v(k) * k
1152
+ end function p_part
1153
+ integer function p_total(s)
1154
+ {dt}
1155
+ class(pair), intent(in) :: s
1156
+ p_total = s%part(1) + s%part(2)
1157
+ end function p_total
1158
+ """, decls="type(pair) :: q",
1159
+ body="""
1160
+ q%v = [5, 7]
1161
+ !$omp target map(tofrom: q) map(from: r1)
1162
+ r1 = q%total()
1163
+ !$omp end target
1164
+ """, checks=[("r1", 19)]))
1165
+ return out
1166
+
1167
+
1168
+ # --- F09 polymorphic dummy arguments, SELECT TYPE, dispatch ----------------------------
1169
+
1170
+ POLY_TYPES = """
1171
+ type base_t
1172
+ integer :: a = 0
1173
+ end type base_t
1174
+ type, extends(base_t) :: ext1
1175
+ integer :: u = 0
1176
+ end type ext1
1177
+ type, extends(base_t) :: ext2
1178
+ integer :: v = 0
1179
+ end type ext2
1180
+ """
1181
+
1182
+ BUMP = """
1183
+ subroutine bump(s)
1184
+ !$omp declare target
1185
+ class(base_t), intent(inout) :: s
1186
+ select type (s)
1187
+ type is (ext1)
1188
+ s%u = s%u + 10
1189
+ type is (ext2)
1190
+ s%v = s%v + 100
1191
+ class default
1192
+ s%a = -1
1193
+ end select
1194
+ end subroutine bump
1195
+ """
1196
+
1197
+ SHAPES = """
1198
+ type, abstract :: shape
1199
+ integer :: id = 0
1200
+ contains
1201
+ procedure(area_if), deferred :: area
1202
+ end type shape
1203
+ abstract interface
1204
+ integer function area_if(s)
1205
+ import :: shape
1206
+ class(shape), intent(in) :: s
1207
+ end function area_if
1208
+ end interface
1209
+ type, extends(shape) :: sq
1210
+ integer :: side = 0
1211
+ contains
1212
+ procedure :: area => sq_area
1213
+ end type sq
1214
+ type, extends(shape) :: rect
1215
+ integer :: w = 0, h = 0
1216
+ contains
1217
+ procedure :: area => rect_area
1218
+ end type rect
1219
+ """
1220
+
1221
+
1222
+ def _shape_procs(dt: str = "!$omp declare target") -> str:
1223
+ return f"""
1224
+ integer function sq_area(s)
1225
+ {dt}
1226
+ class(sq), intent(in) :: s
1227
+ sq_area = s%side * s%side
1228
+ end function sq_area
1229
+ integer function rect_area(s)
1230
+ {dt}
1231
+ class(rect), intent(in) :: s
1232
+ rect_area = s%w * s%h
1233
+ end function rect_area
1234
+ integer function area_of(s)
1235
+ {dt}
1236
+ class(shape), intent(in) :: s
1237
+ area_of = s%area()
1238
+ end function area_of
1239
+ """
1240
+
1241
+
1242
+ C_SELECT = ("OpenMP 5.2 §5.3 p.107 l.17-19 (SELECT TYPE in OpenMP regions); "
1243
+ "Fortran 2018 11.1.11 (SELECT TYPE)")
1244
+
1245
+
1246
+ def _poly() -> list[V]:
1247
+ out = []
1248
+ out.append(V("poly", "select-type", "a declare target subroutine with a "
1249
+ "CLASS(base_t) dummy and SELECT TYPE, called on the device "
1250
+ "with mapped non-polymorphic objects of three types",
1251
+ [C_TBP, C_DT, C_SELECT], types=POLY_TYPES, procs=BUMP,
1252
+ decls="type(ext1) :: e1\ntype(ext2) :: e2\ntype(base_t) :: b0",
1253
+ body="""
1254
+ !$omp target map(tofrom: e1, e2, b0)
1255
+ call bump(e1)
1256
+ call bump(e2)
1257
+ call bump(b0)
1258
+ !$omp end target
1259
+ r1 = e1%u
1260
+ r2 = e2%v
1261
+ r3 = b0%a
1262
+ """, checks=[("r1", 10), ("r2", 100), ("r3", -1)]))
1263
+ out.append(V("poly", "dispatch", "dynamic dispatch of a deferred binding "
1264
+ "(abstract type) through a CLASS(shape) dummy on the device",
1265
+ [C_TBP, C_DT], types=SHAPES, procs=_shape_procs(),
1266
+ decls="type(sq) :: q\ntype(rect) :: rr",
1267
+ body="""
1268
+ q%side = 3
1269
+ rr%w = 4
1270
+ rr%h = 5
1271
+ !$omp target map(tofrom: q, rr) map(from: r1)
1272
+ r1 = area_of(q) + area_of(rr)
1273
+ !$omp end target
1274
+ """, checks=[("r1", 29)]))
1275
+ out.append(V("poly", "dispatch-loop", "dynamic dispatch on every element "
1276
+ "of an array in a target teams distribute parallel do with a "
1277
+ "reduction", [C_TBP, C_DT], types=SHAPES,
1278
+ procs=_shape_procs(),
1279
+ decls="type(sq) :: qs(n)\ninteger :: i, tot",
1280
+ body="""
1281
+ do i = 1, n
1282
+ qs(i)%side = i
1283
+ end do
1284
+ tot = 0
1285
+ !$omp target teams distribute parallel do map(to: qs) reduction(+: tot)
1286
+ do i = 1, n
1287
+ tot = tot + area_of(qs(i))
1288
+ end do
1289
+ r1 = tot
1290
+ """, checks=[("r1", S2)]))
1291
+ out.append(V("poly", "class-is", "SELECT TYPE with TYPE IS and CLASS IS "
1292
+ "guards on the device", [C_DT, C_SELECT], types=POLY_TYPES,
1293
+ procs="""
1294
+ subroutine tag(s, t)
1295
+ !$omp declare target
1296
+ class(base_t), intent(in) :: s
1297
+ integer, intent(out) :: t
1298
+ t = 0
1299
+ select type (s)
1300
+ class is (base_t)
1301
+ t = 1
1302
+ type is (ext2)
1303
+ t = 2
1304
+ end select
1305
+ end subroutine tag
1306
+ """,
1307
+ decls="type(ext1) :: e1\ntype(ext2) :: e2\ntype(base_t) :: b0\n"
1308
+ "integer :: t1, t2, t3",
1309
+ body="""
1310
+ !$omp target map(tofrom: e1, e2, b0) map(from: t1, t2, t3)
1311
+ call tag(e1, t1)
1312
+ call tag(e2, t2)
1313
+ call tag(b0, t3)
1314
+ !$omp end target
1315
+ r1 = 100 * t1 + 10 * t2 + t3
1316
+ """, checks=[("r1", 121)]))
1317
+ out.append(V("poly", "parent-call", "an overriding binding that calls the "
1318
+ "parent's binding through the parent component, dispatched "
1319
+ "through a CLASS(base_t) dummy", [C_TBP, C_DT],
1320
+ types="""
1321
+ type base_t
1322
+ integer :: a = 0
1323
+ contains
1324
+ procedure :: val => base_val
1325
+ end type base_t
1326
+ type, extends(base_t) :: ext1
1327
+ integer :: u = 0
1328
+ contains
1329
+ procedure :: val => ext1_val
1330
+ end type ext1
1331
+ """, procs="""
1332
+ integer function base_val(s)
1333
+ !$omp declare target
1334
+ class(base_t), intent(in) :: s
1335
+ base_val = s%a
1336
+ end function base_val
1337
+ integer function ext1_val(s)
1338
+ !$omp declare target
1339
+ class(ext1), intent(in) :: s
1340
+ ext1_val = s%base_t%val() + s%u * 10
1341
+ end function ext1_val
1342
+ integer function get_val(s)
1343
+ !$omp declare target
1344
+ class(base_t), intent(in) :: s
1345
+ get_val = s%val()
1346
+ end function get_val
1347
+ """, decls="type(ext1) :: e1\ntype(base_t) :: b0",
1348
+ body="""
1349
+ e1%a = 3
1350
+ e1%u = 4
1351
+ b0%a = 7
1352
+ !$omp target map(tofrom: e1, b0) map(from: r1)
1353
+ r1 = get_val(e1) * 100 + get_val(b0)
1354
+ !$omp end target
1355
+ """, checks=[("r1", 4307)]))
1356
+ out.append(V("poly", "pointer", "a polymorphic pointer associated on the "
1357
+ "device with a TARGET dummy, then a dispatched call",
1358
+ [C_TBP, C_DT], types=SHAPES, procs=_shape_procs() + """
1359
+ integer function area_ptr(q)
1360
+ !$omp declare target
1361
+ type(sq), target, intent(in) :: q
1362
+ class(shape), pointer :: sp
1363
+ sp => q
1364
+ area_ptr = sp%area()
1365
+ end function area_ptr
1366
+ """, decls="type(sq) :: q",
1367
+ body="""
1368
+ q%side = 6
1369
+ !$omp target map(tofrom: q) map(from: r1)
1370
+ r1 = area_ptr(q)
1371
+ !$omp end target
1372
+ """, checks=[("r1", 36)]))
1373
+ out.append(V("poly", "mapped-class", "a CLASS(base_t), ALLOCATABLE object "
1374
+ "with dynamic type ext1 mapped by map(tofrom:)",
1375
+ [C_POLY60, C_DT], types=POLY_TYPES, procs=BUMP,
1376
+ decls="class(base_t), allocatable :: pa",
1377
+ body="""
1378
+ allocate(ext1 :: pa)
1379
+ pa%a = 1
1380
+ !$omp target map(tofrom: pa)
1381
+ call bump(pa)
1382
+ !$omp end target
1383
+ r1 = -1
1384
+ select type (pa)
1385
+ type is (ext1)
1386
+ r1 = pa%u
1387
+ end select
1388
+ """, checks=[("r1", 10)], legality="unspecified",
1389
+ why="OpenMP 6.0 §7.9.6 p.288 l.10: a map list item of "
1390
+ "polymorphic type (Fortran): the behavior is unspecified; "
1391
+ "OpenMP 6.0 §B.2 p.898 l.18-19 (5.2 to 6.0: restrictions "
1392
+ "changed and behavior clarified for polymorphic types)"))
1393
+ out.append(V("poly", "firstprivate-class", "firstprivate of a "
1394
+ "CLASS(base_t) dummy argument on a target construct",
1395
+ ["OpenMP 6.0 §7.5.4 p.228 l.8-9 (firstprivate on target of "
1396
+ "a polymorphic variable: unspecified)"], types=POLY_TYPES,
1397
+ procs="""
1398
+ subroutine probe(s, r)
1399
+ class(base_t), intent(in) :: s
1400
+ integer, intent(out) :: r
1401
+ r = 0
1402
+ !$omp target firstprivate(s) map(from: r)
1403
+ r = s%a + 1
1404
+ !$omp end target
1405
+ end subroutine probe
1406
+ """, decls="type(ext1) :: e1",
1407
+ body="""
1408
+ e1%a = 41
1409
+ call probe(e1, r1)
1410
+ """, checks=[("r1", 42)], legality="unspecified",
1411
+ why="OpenMP 6.0 §7.5.4 p.228 l.8-9: firstprivate on a target "
1412
+ "construct of a variable of polymorphic type: the "
1413
+ "behavior is unspecified"))
1414
+ return out
1415
+
1416
+
1417
+ # --- F10 CLASS(*) ----------------------------------------------------------------------
1418
+
1419
+ def _unlimited() -> list[V]:
1420
+ out = []
1421
+ pt = "type pt\n integer :: a = 0\nend type pt\n"
1422
+ incr = """
1423
+ subroutine incr_any(x)
1424
+ !$omp declare target
1425
+ class(*), intent(inout) :: x
1426
+ select type (x)
1427
+ type is (integer)
1428
+ x = x + 1
1429
+ type is (real(8))
1430
+ x = x + 0.5d0
1431
+ type is (pt)
1432
+ x%a = x%a + 2
1433
+ end select
1434
+ end subroutine incr_any
1435
+ """
1436
+ out.append(V("unlimited", "select-type", "a declare target subroutine with "
1437
+ "a CLASS(*) dummy and SELECT TYPE over intrinsic and derived "
1438
+ "types, called on the device", [C_DT, C_SELECT], types=pt,
1439
+ procs=incr, decls="integer :: k\nreal(8) :: d\ntype(pt) :: q",
1440
+ body="""
1441
+ k = 41
1442
+ d = 1.5d0
1443
+ q%a = 5
1444
+ !$omp target map(tofrom: k, d, q)
1445
+ call incr_any(k)
1446
+ call incr_any(d)
1447
+ call incr_any(q)
1448
+ !$omp end target
1449
+ r1 = k
1450
+ r2 = nint(d * 10)
1451
+ r3 = q%a
1452
+ """, checks=[("r1", 42), ("r2", 20), ("r3", 7)]))
1453
+ out.append(V("unlimited", "classify", "a CLASS(*) function classifying "
1454
+ "array elements of two derived types in a target teams "
1455
+ "distribute parallel do", [C_DT, C_SELECT],
1456
+ types=pt + "type qt\n integer :: b = 0\nend type qt\n",
1457
+ procs="""
1458
+ integer function code_of(x)
1459
+ !$omp declare target
1460
+ class(*), intent(in) :: x
1461
+ select type (x)
1462
+ type is (integer)
1463
+ code_of = 1
1464
+ type is (pt)
1465
+ code_of = 2
1466
+ type is (qt)
1467
+ code_of = 3
1468
+ class default
1469
+ code_of = 0
1470
+ end select
1471
+ end function code_of
1472
+ """, decls="type(pt) :: ps(n)\ntype(qt) :: qs(n)\n"
1473
+ "integer :: i, tot",
1474
+ body="""
1475
+ tot = 0
1476
+ !$omp target teams distribute parallel do map(to: ps, qs) reduction(+: tot)
1477
+ do i = 1, n
1478
+ tot = tot + code_of(ps(i)) + code_of(qs(i))
1479
+ end do
1480
+ r1 = tot
1481
+ """, checks=[("r1", 5 * N)]))
1482
+ out.append(V("unlimited", "mapped", "a CLASS(*), ALLOCATABLE object "
1483
+ "(dynamic type pt) mapped by map(tofrom:)", [C_POLY60, C_DT],
1484
+ types=pt, procs=incr, decls="class(*), allocatable :: u",
1485
+ body="""
1486
+ allocate(u, source=pt(5))
1487
+ !$omp target map(tofrom: u)
1488
+ call incr_any(u)
1489
+ !$omp end target
1490
+ r1 = -1
1491
+ select type (u)
1492
+ type is (pt)
1493
+ r1 = u%a
1494
+ end select
1495
+ """, checks=[("r1", 7)], legality="unspecified",
1496
+ why="OpenMP 6.0 §7.9.6 p.288 l.10: a map list item of "
1497
+ "polymorphic type (Fortran): the behavior is unspecified"))
1498
+ return out
1499
+
1500
+
1501
+ # --- F11 defined assignment and finalization -------------------------------------------
1502
+
1503
+ CT = """
1504
+ type ct
1505
+ integer :: v = 0
1506
+ integer :: copies = 0
1507
+ contains
1508
+ procedure :: asg => ct_asg
1509
+ generic :: assignment(=) => asg
1510
+ end type ct
1511
+ """
1512
+
1513
+ CT_ASG = """
1514
+ subroutine ct_asg(a, b)
1515
+ !$omp declare target
1516
+ class(ct), intent(inout) :: a
1517
+ class(ct), intent(in) :: b
1518
+ a%v = b%v
1519
+ a%copies = b%copies + 1
1520
+ end subroutine ct_asg
1521
+ """
1522
+
1523
+ FT = """
1524
+ type ft
1525
+ integer :: v = 0
1526
+ contains
1527
+ final :: ft_fin
1528
+ end type ft
1529
+ """
1530
+
1531
+ # `to`, 5.2's deprecated synonym of enter (5.2 §7.8.2), which CCE 19/20 and
1532
+ # NVHPC still require: the family measures finalization, not the spelling
1533
+ FT_DECLS = """
1534
+ integer :: fin_count = 0
1535
+ !$omp declare target to(fin_count)
1536
+ """
1537
+
1538
+ FT_FIN = """
1539
+ subroutine ft_fin(o)
1540
+ !$omp declare target
1541
+ type(ft), intent(inout) :: o
1542
+ !$omp atomic update
1543
+ fin_count = fin_count + 1
1544
+ end subroutine ft_fin
1545
+ """
1546
+
1547
+ C_FIN = ("Fortran 2018 7.5.6.3 (when finalization occurs); "
1548
+ "OpenMP 5.2 §1.2.6 p.19 (type-bound procedures in declare target)")
1549
+
1550
+
1551
+ def _assignfinal() -> list[V]:
1552
+ out = []
1553
+ out.append(V("assignfinal", "tbp-assign", "an intrinsic-looking assignment "
1554
+ "y = x in a target region invokes the type-bound defined "
1555
+ "assignment", [C_TBP, C_DT,
1556
+ "Fortran 2018 10.2.1.4 (defined assignment)"],
1557
+ types=CT, procs=CT_ASG, decls="type(ct) :: x, y",
1558
+ body="""
1559
+ x%v = 5
1560
+ x%copies = 0
1561
+ !$omp target map(tofrom: x, y)
1562
+ y = x
1563
+ !$omp end target
1564
+ r1 = y%v
1565
+ r2 = y%copies
1566
+ """, checks=[("r1", 5), ("r2", 1)]))
1567
+ out.append(V("assignfinal", "iface-assign", "a defined assignment by a "
1568
+ "generic interface (not type-bound) in a target region",
1569
+ [C_DT, C_PROCREF, "Fortran 2018 10.2.1.4"],
1570
+ types="""
1571
+ type nt
1572
+ integer :: v = 0
1573
+ integer :: n = 0
1574
+ end type nt
1575
+ interface assignment(=)
1576
+ module procedure nt_asg
1577
+ end interface
1578
+ """, procs="""
1579
+ subroutine nt_asg(a, b)
1580
+ !$omp declare target
1581
+ type(nt), intent(out) :: a
1582
+ type(nt), intent(in) :: b
1583
+ a%v = b%v * 2
1584
+ a%n = b%n + 1
1585
+ end subroutine nt_asg
1586
+ """, decls="type(nt) :: x, y",
1587
+ body="""
1588
+ x%v = 5
1589
+ x%n = 0
1590
+ !$omp target map(tofrom: x, y)
1591
+ y = x
1592
+ !$omp end target
1593
+ r1 = y%v
1594
+ r2 = y%n
1595
+ """, checks=[("r1", 10), ("r2", 1)]))
1596
+ out.append(V("assignfinal", "firstprivate", "firstprivate(x) on a target "
1597
+ "construct initializes the new list item as if by the "
1598
+ "type-bound defined assignment", [
1599
+ "OpenMP 5.2 §5.4.4 p.113 l.3-6 (firstprivate "
1600
+ "initialization by a compatible type-bound defined "
1601
+ "assignment)", C_TBP],
1602
+ types=CT, procs=CT_ASG, decls="type(ct) :: x",
1603
+ body="""
1604
+ x%v = 5
1605
+ x%copies = 0
1606
+ !$omp target firstprivate(x) map(from: r1, r2)
1607
+ r1 = x%copies
1608
+ r2 = x%v
1609
+ !$omp end target
1610
+ """, checks=[("r1", 1), ("r2", 5)]))
1611
+ out.append(V("assignfinal", "lastprivate", "lastprivate(w) of a parallel "
1612
+ "do in a target region: the original is updated as if by the "
1613
+ "type-bound defined assignment", [
1614
+ "OpenMP 5.2 §5.4.5 p.115 l.24-25 (lastprivate update by a "
1615
+ "type-bound defined assignment)", C_TBP],
1616
+ types=CT, procs=CT_ASG, decls="type(ct) :: w\ninteger :: i",
1617
+ body="""
1618
+ w%v = -1
1619
+ w%copies = 0
1620
+ !$omp target map(tofrom: w)
1621
+ !$omp parallel do lastprivate(w)
1622
+ do i = 1, n
1623
+ w%v = i
1624
+ w%copies = 0
1625
+ end do
1626
+ !$omp end target
1627
+ r1 = w%v
1628
+ r2 = w%copies
1629
+ """, checks=[("r1", N), ("r2", 1)]))
1630
+ fin_setup = "fin_count = 0\n!$omp target update to(fin_count)\n"
1631
+ out.append(V("assignfinal", "final-local", "a local object of a "
1632
+ "finalizable type in a declare target subroutine is finalized "
1633
+ "on return (the final subroutine counts on the device)",
1634
+ [C_FIN, C_DT], types=FT, mod_decls=FT_DECLS,
1635
+ procs=FT_FIN + """
1636
+ subroutine work(k, r)
1637
+ !$omp declare target
1638
+ integer, intent(in) :: k
1639
+ integer, intent(out) :: r
1640
+ type(ft) :: o
1641
+ o%v = k
1642
+ r = 2 * o%v
1643
+ end subroutine work
1644
+ """, decls="integer :: res(n), i",
1645
+ body=fin_setup + """
1646
+ !$omp target teams distribute parallel do map(tofrom: res)
1647
+ do i = 1, n
1648
+ call work(i, res(i))
1649
+ end do
1650
+ !$omp target update from(fin_count)
1651
+ r1 = fin_count
1652
+ r2 = sum(res)
1653
+ """, checks=[("r1", N), ("r2", 2 * S1)]))
1654
+ out.append(V("assignfinal", "final-private", "private(x) of a finalizable "
1655
+ "type on a target construct: the private copy is finalized at "
1656
+ "the end of the region", [C_FINAL, C_FIN], types=FT,
1657
+ mod_decls=FT_DECLS, procs=FT_FIN, decls="type(ft) :: x",
1658
+ body=fin_setup + """
1659
+ !$omp target private(x)
1660
+ x%v = 3
1661
+ !$omp end target
1662
+ !$omp target update from(fin_count)
1663
+ r1 = fin_count
1664
+ """, checks=[("r1", 1)]))
1665
+ out.append(V("assignfinal", "final-assign", "intrinsic assignment to a "
1666
+ "local finalizable object in device code finalizes the "
1667
+ "left-hand side, and the object is finalized on return",
1668
+ ["Fortran 2018 7.5.6.3 para 1 and 3 (intrinsic assignment, "
1669
+ "RETURN/END)", C_DT], types=FT, mod_decls=FT_DECLS,
1670
+ procs=FT_FIN + """
1671
+ subroutine copy_work(s, r)
1672
+ !$omp declare target
1673
+ type(ft), intent(in) :: s
1674
+ integer, intent(out) :: r
1675
+ type(ft) :: o
1676
+ o = s
1677
+ r = o%v
1678
+ end subroutine copy_work
1679
+ """, decls="type(ft) :: src\ninteger :: res(n), i",
1680
+ body=fin_setup + """
1681
+ src%v = 4
1682
+ !$omp target teams distribute parallel do map(to: src) map(tofrom: res)
1683
+ do i = 1, n
1684
+ call copy_work(src, res(i))
1685
+ end do
1686
+ !$omp target update from(fin_count)
1687
+ r1 = fin_count
1688
+ r2 = sum(res)
1689
+ """, checks=[("r1", 2 * N), ("r2", 4 * N)]))
1690
+ out.append(V("assignfinal", "final-dealloc", "DEALLOCATE of an allocatable "
1691
+ "finalizable object in device code finalizes it once",
1692
+ ["Fortran 2018 7.5.6.3 para 2 (deallocation)", C_DT],
1693
+ types=FT, mod_decls=FT_DECLS, procs=FT_FIN + """
1694
+ subroutine alloc_work(k, r)
1695
+ !$omp declare target
1696
+ integer, intent(in) :: k
1697
+ integer, intent(out) :: r
1698
+ type(ft), allocatable :: o
1699
+ allocate(o)
1700
+ o%v = k
1701
+ r = o%v + 1
1702
+ deallocate(o)
1703
+ end subroutine alloc_work
1704
+ """, decls="integer :: res(n), i",
1705
+ body=fin_setup + """
1706
+ !$omp target teams distribute parallel do map(tofrom: res)
1707
+ do i = 1, n
1708
+ call alloc_work(i, res(i))
1709
+ end do
1710
+ !$omp target update from(fin_count)
1711
+ r1 = fin_count
1712
+ r2 = sum(res)
1713
+ """, checks=[("r1", N), ("r2", S1 + N)]))
1714
+ return out
1715
+
1716
+
1717
+ # --- F12 declare reduction on derived types --------------------------------------------
1718
+
1719
+ V2 = "type v2\n integer :: x = 0, y = 0\nend type v2\n"
1720
+ C_DR = ("OpenMP 5.2 §5.5.11 p.139-140 (declare reduction); §5.5.2 p.125 "
1721
+ "l.25-27 (procedures of a reduction used in a target region are "
1722
+ "declare target)")
1723
+
1724
+
1725
+ def _dreduce() -> list[V]:
1726
+ out = []
1727
+ vadd = """
1728
+ function vadd(a, b) result(c)
1729
+ !$omp declare target
1730
+ type(v2), intent(in) :: a, b
1731
+ type(v2) :: c
1732
+ c%x = a%x + b%x
1733
+ c%y = a%y + b%y
1734
+ end function vadd
1735
+ """
1736
+ loop = """
1737
+ !$omp target teams distribute parallel do reduction({rid}: acc)
1738
+ do i = 1, n
1739
+ {stmt}
1740
+ end do
1741
+ r1 = acc%x
1742
+ r2 = acc%y
1743
+ """
1744
+ out.append(V("dreduce", "function", "a declare reduction on a derived "
1745
+ "type whose combiner calls a function, used on target teams "
1746
+ "distribute parallel do", [C_DR,
1747
+ "OpenMP 5.2 §17.2 p.341 l.11-13"],
1748
+ types=V2, procs=vadd,
1749
+ decls="type(v2) :: acc\ninteger :: i\n"
1750
+ "!$omp declare reduction(vsum: v2: omp_out = "
1751
+ "vadd(omp_out, omp_in)) initializer(omp_priv = v2(0, 0))",
1752
+ body="acc = v2(0, 0)\n" + loop.format(
1753
+ rid="vsum", stmt=" acc = vadd(acc, v2(i, 2 * i))"),
1754
+ checks=[("r1", S1), ("r2", 2 * S1)]))
1755
+ vcomb = """
1756
+ subroutine vcomb(o, i)
1757
+ !$omp declare target
1758
+ type(v2), intent(inout) :: o
1759
+ type(v2), intent(in) :: i
1760
+ o%x = o%x + i%x
1761
+ o%y = o%y + i%y
1762
+ end subroutine vcomb
1763
+ subroutine vinit(p)
1764
+ !$omp declare target
1765
+ type(v2), intent(out) :: p
1766
+ p%x = 0
1767
+ p%y = 0
1768
+ end subroutine vinit
1769
+ """
1770
+ out.append(V("dreduce", "subroutine", "a declare reduction whose combiner "
1771
+ "and initializer are subroutine references",
1772
+ [C_DR, "OpenMP 5.2 §5.5.2.1, §5.5.2.2 p.126-128"],
1773
+ types=V2, procs=vcomb,
1774
+ decls="type(v2) :: acc\ninteger :: i\n"
1775
+ "!$omp declare reduction(vsum2: v2: vcomb(omp_out, "
1776
+ "omp_in)) initializer(vinit(omp_priv))",
1777
+ body="acc = v2(0, 0)\n" + loop.format(
1778
+ rid="vsum2", stmt=" acc%x = acc%x + i\n acc%y = acc%y + 1"),
1779
+ checks=[("r1", S1), ("r2", N)]))
1780
+ out.append(V("dreduce", "operator", "a declare reduction(+) for a derived "
1781
+ "type whose combiner uses a type-bound operator(+)",
1782
+ [C_DR, C_TBP],
1783
+ types="""
1784
+ type w2
1785
+ integer :: x = 0, y = 0
1786
+ contains
1787
+ procedure :: add => w2_add
1788
+ generic :: operator(+) => add
1789
+ end type w2
1790
+ """, procs="""
1791
+ function w2_add(a, b) result(c)
1792
+ !$omp declare target
1793
+ class(w2), intent(in) :: a
1794
+ type(w2), intent(in) :: b
1795
+ type(w2) :: c
1796
+ c%x = a%x + b%x
1797
+ c%y = a%y + b%y
1798
+ end function w2_add
1799
+ """,
1800
+ decls="type(w2) :: acc\ninteger :: i\n"
1801
+ "!$omp declare reduction(+: w2: omp_out = omp_out + "
1802
+ "omp_in) initializer(omp_priv = w2(0, 0))",
1803
+ body="acc%x = 0\nacc%y = 0\n" + loop.format(
1804
+ rid="+", stmt=" acc = acc + w2(i, 1)"),
1805
+ checks=[("r1", S1), ("r2", N)]))
1806
+ out.append(V("dreduce", "default-init", "a declare reduction without an "
1807
+ "initializer clause: the private copies get the type's default "
1808
+ "initialization", [C_DR, "OpenMP 5.2 §5.5.2.2 p.128 l.6"],
1809
+ types="type d2\n integer :: x = 0, y = 0\nend type d2\n",
1810
+ procs="""
1811
+ subroutine dcomb(o, i)
1812
+ !$omp declare target
1813
+ type(d2), intent(inout) :: o
1814
+ type(d2), intent(in) :: i
1815
+ o%x = o%x + i%x
1816
+ o%y = o%y + i%y
1817
+ end subroutine dcomb
1818
+ """,
1819
+ decls="type(d2) :: acc\ninteger :: i\n"
1820
+ "!$omp declare reduction(dsum: d2: dcomb(omp_out, "
1821
+ "omp_in))",
1822
+ body=loop.format(rid="dsum",
1823
+ stmt=" acc%x = acc%x + i\n acc%y = acc%y + 2"),
1824
+ checks=[("r1", S1), ("r2", 2 * N)]))
1825
+ out.append(V("dreduce", "argmax", "a declare reduction keeping the element "
1826
+ "with the largest key", [C_DR,
1827
+ "OpenMP 5.2 §5.5.2.2 p.128 l.6"],
1828
+ types="type kv\n integer :: key = -1, val = 0\nend type kv\n",
1829
+ procs="""
1830
+ subroutine kmax(o, i)
1831
+ !$omp declare target
1832
+ type(kv), intent(inout) :: o
1833
+ type(kv), intent(in) :: i
1834
+ if (i%key > o%key) then
1835
+ o%key = i%key
1836
+ o%val = i%val
1837
+ end if
1838
+ end subroutine kmax
1839
+ """,
1840
+ decls="type(kv) :: acc\ninteger :: i\n"
1841
+ "!$omp declare reduction(kmx: kv: kmax(omp_out, omp_in))",
1842
+ body="""
1843
+ !$omp target teams distribute parallel do reduction(kmx: acc)
1844
+ do i = 1, n
1845
+ if (i > acc%key) then
1846
+ acc%key = i
1847
+ acc%val = 3 * i
1848
+ end if
1849
+ end do
1850
+ r1 = acc%key
1851
+ r2 = acc%val
1852
+ """, checks=[("r1", N), ("r2", 3 * N)]))
1853
+ out.append(V("dreduce", "nested", "a declare reduction on a parallel do "
1854
+ "inside a target region (the structure mapped tofrom)",
1855
+ [C_DR], types=V2, procs=vadd,
1856
+ decls="type(v2) :: acc\ninteger :: i\n"
1857
+ "!$omp declare reduction(vsum: v2: omp_out = "
1858
+ "vadd(omp_out, omp_in)) initializer(omp_priv = v2(0, 0))",
1859
+ body="""
1860
+ acc = v2(0, 0)
1861
+ !$omp target map(tofrom: acc)
1862
+ !$omp parallel do reduction(vsum: acc)
1863
+ do i = 1, n
1864
+ acc = vadd(acc, v2(1, i))
1865
+ end do
1866
+ !$omp end target
1867
+ r1 = acc%x
1868
+ r2 = acc%y
1869
+ """, checks=[("r1", N), ("r2", S1)]))
1870
+ return out
1871
+
1872
+
1873
+ # --- F13 elements and sections of arrays of structures (the AOMP map-test forms) ------
1874
+
1875
+ DC = """
1876
+ type dc
1877
+ integer :: g(20) = 0
1878
+ integer :: i = 0
1879
+ end type dc
1880
+ """
1881
+
1882
+
1883
+ def _elemsec() -> list[V]:
1884
+ """Forms of ROCm/aomp's fortran-map-tests (harvest 2's CCE leads)
1885
+ written as family variants: an element or a
1886
+ section of an array of structures, a component of an element, sections
1887
+ of two members, an allocatable parent."""
1888
+ out = []
1889
+ d = "type(dc) :: vk(5)\ninteger :: l"
1890
+ out.append(V("elemsec", "element", "map(tofrom: vk(5)): one element of an "
1891
+ "array of structures", [C_SECTION, C_MAP], types=DC,
1892
+ decls=d, body="""
1893
+ !$omp target map(tofrom: vk(5))
1894
+ do l = 1, 20
1895
+ vk(5)%g(l) = 20 + l
1896
+ end do
1897
+ vk(5)%i = 40
1898
+ !$omp end target
1899
+ r1 = sum(vk(5)%g)
1900
+ r2 = vk(5)%i
1901
+ r3 = sum(vk(4)%g)
1902
+ """, checks=[("r1", 400 + 210), ("r2", 40), ("r3", 0)]))
1903
+ out.append(V("elemsec", "comp-element", "map(tofrom: vk(4)%g(3)): an "
1904
+ "element of a component of an array element",
1905
+ [C_SECTION, C_MAP], types=DC, decls=d, body="""
1906
+ !$omp target map(tofrom: vk(4)%g(3))
1907
+ vk(4)%g(3) = 74
1908
+ !$omp end target
1909
+ r1 = vk(4)%g(3)
1910
+ r2 = sum(vk(4)%g)
1911
+ """, checks=[("r1", 74), ("r2", 74)]))
1912
+ out.append(V("elemsec", "comp-section", "map(tofrom: vk(5)%g(3:5)): a "
1913
+ "section of a component of an array element",
1914
+ [C_SECTION, C_MAP], types=DC, decls=d, body="""
1915
+ do l = 1, 20
1916
+ vk(5)%g(l) = 100 + l
1917
+ end do
1918
+ !$omp target map(tofrom: vk(5)%g(3:5))
1919
+ do l = 3, 5
1920
+ vk(5)%g(l) = l
1921
+ end do
1922
+ !$omp end target
1923
+ r1 = sum(vk(5)%g)
1924
+ """, checks=[("r1", sum(100 + x for x in range(1, 21)) -
1925
+ sum(100 + x for x in range(3, 6)) +
1926
+ 12)]))
1927
+ out.append(V("elemsec", "struct-section", "map(tofrom: vk(3:5)): a section "
1928
+ "of an array of structures", [C_SECTION, C_MAP], types=DC,
1929
+ decls=d, body="""
1930
+ !$omp target map(tofrom: vk(3:5))
1931
+ do l = 3, 5
1932
+ vk(l)%i = 10 * l
1933
+ end do
1934
+ !$omp end target
1935
+ r1 = sum(vk%i)
1936
+ """, checks=[("r1", 120)]))
1937
+ da = "type da\n integer :: b(10) = 0\n integer :: d(10) = 0\nend type da"
1938
+ out.append(V("elemsec", "two-members", "map(tofrom: f%b(3:6), f%d(3:6)): "
1939
+ "sections of two members of one structure",
1940
+ [C_SECTION, C_STRUCTELT], types=da,
1941
+ decls="type(da) :: f\ninteger :: l", body="""
1942
+ !$omp target map(tofrom: f%b(3:6), f%d(3:6))
1943
+ do l = 3, 6
1944
+ f%b(l) = l
1945
+ f%d(l) = 2 * l
1946
+ end do
1947
+ !$omp end target
1948
+ r1 = sum(f%b)
1949
+ r2 = sum(f%d)
1950
+ """, checks=[("r1", 18), ("r2", 36)]))
1951
+ out.append(V("elemsec", "two-structs", "sections of two members of each "
1952
+ "of two structures on one construct",
1953
+ [C_SECTION, C_STRUCTELT], types=da,
1954
+ decls="type(da) :: f, h\ninteger :: l", body="""
1955
+ !$omp target map(tofrom: f%b(3:6), f%d(3:6), h%b(3:6), h%d(3:6))
1956
+ do l = 3, 6
1957
+ f%b(l) = l
1958
+ f%d(l) = 2 * l
1959
+ h%b(l) = 3 * l
1960
+ h%d(l) = 4 * l
1961
+ end do
1962
+ !$omp end target
1963
+ r1 = sum(f%b) + sum(f%d)
1964
+ r2 = sum(h%b) + sum(h%d)
1965
+ """, checks=[("r1", 54), ("r2", 126)]))
1966
+ out.append(V("elemsec", "nested-element", "map(tofrom: vk(4)%h%c(8)): an "
1967
+ "element of a nested member of an array element",
1968
+ [C_SECTION, C_MAP], types="""
1969
+ type dn
1970
+ integer :: c(10) = 0
1971
+ end type dn
1972
+ type dm
1973
+ type(dn) :: h
1974
+ integer :: i = 0
1975
+ end type dm
1976
+ """, decls="type(dm) :: vk(5)", body="""
1977
+ !$omp target map(tofrom: vk(4)%h%c(8))
1978
+ vk(4)%h%c(8) = 42
1979
+ !$omp end target
1980
+ r1 = vk(4)%h%c(8)
1981
+ r2 = sum(vk(4)%h%c)
1982
+ """, checks=[("r1", 42), ("r2", 42)]))
1983
+ out.append(V("elemsec", "alloc-parent", "map(tofrom: vj%h(4:8)): a section "
1984
+ "of an allocatable array-of-structures component of an "
1985
+ "allocatable scalar structure", [C_SECTION, C_ALLOCCOMP],
1986
+ types="""
1987
+ type da2
1988
+ integer :: a = 0
1989
+ end type da2
1990
+ type db
1991
+ type(da2), allocatable :: h(:)
1992
+ end type db
1993
+ """, decls="type(db), allocatable :: vj\ninteger :: l",
1994
+ body="""
1995
+ allocate(vj)
1996
+ allocate(vj%h(10))
1997
+ !$omp target map(tofrom: vj%h(4:8))
1998
+ do l = 4, 8
1999
+ vj%h(l)%a = 3 * l
2000
+ end do
2001
+ !$omp end target
2002
+ r1 = sum(vj%h%a)
2003
+ """, checks=[("r1", 90)]))
2004
+ out.append(V("elemsec", "alloc-chain", "a structure whose allocatable "
2005
+ "scalar components hold allocatable scalar and array "
2006
+ "components, mapped whole (recursive deep copy)",
2007
+ [C_ALLOCCOMP, C_DEFMAPPER], types="""
2008
+ type t1
2009
+ integer, allocatable :: a
2010
+ integer, allocatable :: c(:)
2011
+ end type t1
2012
+ type t2
2013
+ type(t1), allocatable :: f
2014
+ end type t2
2015
+ type t3
2016
+ type(t2), allocatable :: h
2017
+ integer, allocatable :: g(:)
2018
+ end type t3
2019
+ """, decls="type(t3) :: x\ninteger :: l", body="""
2020
+ allocate(x%h)
2021
+ allocate(x%h%f)
2022
+ allocate(x%h%f%a)
2023
+ allocate(x%h%f%c(10))
2024
+ allocate(x%g(10))
2025
+ x%h%f%a = 0
2026
+ x%h%f%c = 0
2027
+ x%g = 0
2028
+ !$omp target map(tofrom: x)
2029
+ x%h%f%a = 7
2030
+ do l = 1, 10
2031
+ x%h%f%c(l) = l
2032
+ x%g(l) = 2 * l
2033
+ end do
2034
+ !$omp end target
2035
+ r1 = x%h%f%a
2036
+ r2 = sum(x%h%f%c)
2037
+ r3 = sum(x%g)
2038
+ """, checks=[("r1", 7), ("r2", 55), ("r3", 110)]))
2039
+ return out
2040
+
2041
+
2042
+ # --- OpenACC 3.4 -----------------------------------------------------------------------
2043
+
2044
+ A_DATA = ("OpenACC 3.4 §2.7.1 p.49-50 l.1711-1713 (a derived-type variable: "
2045
+ "its members are copied; allocatable or pointer members' data are "
2046
+ "not)")
2047
+ A_ATTACH = ("OpenACC 3.4 §2.6.8 p.47-48 (attachment), §2.7.2 (data clause "
2048
+ "actions: attach)")
2049
+ A_UPDATE = ("OpenACC 3.4 §2.14.4 p.90 l.3296-3299 (members of derived types, "
2050
+ "subarrays of members)")
2051
+ A_ROUTINE = "OpenACC 3.4 §2.15.1 (routine directive)"
2052
+
2053
+
2054
+ def _acc() -> list[V]:
2055
+ out = []
2056
+ acc = dict(model="acc")
2057
+ out.append(V("acc-copy", "struct", "copy(s) of a structure with a "
2058
+ "fixed-size array member in a parallel loop", [A_DATA],
2059
+ types="type sa\n integer :: b(n) = 0\n integer :: c = 0\n"
2060
+ "end type sa", decls="type(sa) :: s\ninteger :: i",
2061
+ body="""
2062
+ do i = 1, n
2063
+ s%b(i) = i
2064
+ end do
2065
+ s%c = 5
2066
+ !$acc parallel loop copy(s)
2067
+ do i = 1, n
2068
+ s%b(i) = s%b(i) + s%c
2069
+ end do
2070
+ r1 = sum(s%b)
2071
+ """, checks=[("r1", S1 + 5 * N)], **acc))
2072
+ out.append(V("acc-copy", "aos", "copy(p) of an array of structures",
2073
+ [A_DATA], types="type pt\n integer :: x = 0, y = 0\n"
2074
+ "end type pt", decls="type(pt) :: p(n)\ninteger :: i",
2075
+ body="""
2076
+ do i = 1, n
2077
+ p(i)%x = i
2078
+ end do
2079
+ !$acc parallel loop copy(p)
2080
+ do i = 1, n
2081
+ p(i)%y = 2 * p(i)%x + 1
2082
+ end do
2083
+ r1 = sum(p%y)
2084
+ """, checks=[("r1", 2 * S1 + N)], **acc))
2085
+ d = "type(vec) :: x\ninteger :: i"
2086
+ out.append(V("acc-deep", "enterexit", "manual deep copy: enter data "
2087
+ "copyin(x), then copyin(x%a) (attach); a parallel loop; "
2088
+ "copyout(x%a); delete(x)", [A_DATA, A_ATTACH],
2089
+ types=VEC, decls=d, body=VEC_SETUP + """
2090
+ !$acc enter data copyin(x)
2091
+ !$acc enter data copyin(x%a)
2092
+ !$acc parallel loop present(x)
2093
+ do i = 1, n
2094
+ x%a(i) = x%a(i) + x%n
2095
+ end do
2096
+ !$acc exit data copyout(x%a)
2097
+ !$acc exit data delete(x)
2098
+ r1 = sum(x%a)
2099
+ """, checks=[("r1", S1 + N * N)], **acc))
2100
+ out.append(V("acc-deep", "data", "a data construct with copyin(x) "
2101
+ "copy(x%a) around a parallel loop", [A_DATA, A_ATTACH],
2102
+ types=VEC, decls=d, body=VEC_SETUP + """
2103
+ !$acc data copyin(x) copy(x%a)
2104
+ !$acc parallel loop
2105
+ do i = 1, n
2106
+ x%a(i) = 2 * x%a(i)
2107
+ end do
2108
+ !$acc end data
2109
+ r1 = sum(x%a)
2110
+ """, checks=[("r1", 2 * S1)], **acc))
2111
+ out.append(V("acc-deep", "attach", "explicit attach and detach clauses for "
2112
+ "a pointer member whose target is copied in separately",
2113
+ [A_ATTACH, "OpenACC 3.4 §2.7.13 (attach clause), §2.7.14 "
2114
+ "(detach clause)"], types=PV,
2115
+ decls="type(pv) :: x\ninteger, target :: buf(n)\ninteger :: i",
2116
+ body="""
2117
+ do i = 1, n
2118
+ buf(i) = i
2119
+ end do
2120
+ x%n = n
2121
+ x%p => buf
2122
+ !$acc enter data copyin(x)
2123
+ !$acc enter data copyin(buf)
2124
+ !$acc enter data attach(x%p)
2125
+ !$acc parallel loop present(x)
2126
+ do i = 1, n
2127
+ x%p(i) = 3 * x%p(i)
2128
+ end do
2129
+ !$acc exit data detach(x%p)
2130
+ !$acc exit data copyout(buf)
2131
+ !$acc exit data delete(x)
2132
+ r1 = sum(buf)
2133
+ """, checks=[("r1", 3 * S1)], **acc))
2134
+ out.append(V("acc-deep", "update", "update self(x%a(1:16)): a subarray "
2135
+ "of an allocatable member, after a device change",
2136
+ [A_UPDATE, A_ATTACH], types=VEC, decls=d,
2137
+ body=VEC_SETUP + """
2138
+ !$acc enter data copyin(x)
2139
+ !$acc enter data copyin(x%a)
2140
+ !$acc parallel loop present(x)
2141
+ do i = 1, n
2142
+ x%a(i) = -x%a(i)
2143
+ end do
2144
+ !$acc update self(x%a(1:16))
2145
+ r1 = sum(x%a(1:16))
2146
+ !$acc exit data copyout(x%a)
2147
+ !$acc exit data delete(x)
2148
+ r2 = sum(x%a)
2149
+ """, checks=[("r1", -136), ("r2", -S1)], **acc))
2150
+ out.append(V("acc-deep", "twolevel", "deep copy of an allocatable member "
2151
+ "of a nested structure member: copyin(o), copyin(o%in%b)",
2152
+ [A_DATA, A_ATTACH], types="""
2153
+ type in_t
2154
+ integer, allocatable :: b(:)
2155
+ end type in_t
2156
+ type out_t
2157
+ type(in_t) :: in
2158
+ integer :: k = 0
2159
+ end type out_t
2160
+ """, decls="type(out_t) :: o\ninteger :: i",
2161
+ body="""
2162
+ allocate(o%in%b(n))
2163
+ do i = 1, n
2164
+ o%in%b(i) = i
2165
+ end do
2166
+ o%k = 3
2167
+ !$acc enter data copyin(o)
2168
+ !$acc enter data copyin(o%in%b)
2169
+ !$acc parallel loop present(o)
2170
+ do i = 1, n
2171
+ o%in%b(i) = o%in%b(i) * o%k
2172
+ end do
2173
+ !$acc exit data copyout(o%in%b)
2174
+ !$acc exit data delete(o)
2175
+ r1 = sum(o%in%b)
2176
+ """, checks=[("r1", 3 * S1)], **acc))
2177
+ out.append(V("acc-routine", "tbp", "a type-bound function with a routine "
2178
+ "seq directive called on each element (non-polymorphic "
2179
+ "objects: the binding resolves statically)",
2180
+ [A_ROUTINE, "Fortran 2018 15.5.6 (resolving type-bound "
2181
+ "procedure references)"],
2182
+ types="""
2183
+ type tg
2184
+ integer :: v = 0
2185
+ contains
2186
+ procedure :: get => tg_get
2187
+ end type tg
2188
+ """, procs="""
2189
+ integer function tg_get(s)
2190
+ !$acc routine seq
2191
+ class(tg), intent(in) :: s
2192
+ tg_get = s%v
2193
+ end function tg_get
2194
+ """, decls="type(tg) :: p(n)\ninteger :: r(n), i",
2195
+ body="""
2196
+ do i = 1, n
2197
+ p(i)%v = i
2198
+ end do
2199
+ !$acc parallel loop copyin(p) copyout(r)
2200
+ do i = 1, n
2201
+ r(i) = 2 * p(i)%get()
2202
+ end do
2203
+ r1 = sum(r)
2204
+ """, checks=[("r1", 2 * S1)], **acc))
2205
+ out.append(V("acc-routine", "dispatch", "dynamic dispatch through a "
2206
+ "CLASS(shape) dummy in a routine seq function",
2207
+ [A_ROUTINE], types=SHAPES,
2208
+ procs=_shape_procs("!$acc routine seq"),
2209
+ decls="type(sq) :: q\ntype(rect) :: rr",
2210
+ body="""
2211
+ q%side = 3
2212
+ rr%w = 4
2213
+ rr%h = 5
2214
+ !$acc serial copyin(q, rr) copyout(r1)
2215
+ r1 = area_of(q) + area_of(rr)
2216
+ !$acc end serial
2217
+ """, checks=[("r1", 29)], legality="unspecified",
2218
+ why="OpenACC 3.4 does not address polymorphic objects or "
2219
+ "type-bound procedure dispatch in compute regions (§1.8 "
2220
+ "p.16 l.496-500 lists polymorphic assignment among the "
2221
+ "Fortran 2008 features whose use may result in "
2222
+ "unspecified behavior); observation only", **acc))
2223
+ return out
2224
+
2225
+
2226
+ FAMILIES = ("nested", "alloccomp", "ptrcomp", "section", "mapper", "pdt",
2227
+ "extends", "tbp", "poly", "unlimited", "assignfinal", "dreduce",
2228
+ "elemsec", "acc-copy", "acc-deep", "acc-routine")
2229
+
2230
+
2231
+ def programs() -> list[Program]:
2232
+ vs = (_nested() + _alloccomp() + _ptrcomp() + _section() + _mapper() +
2233
+ _pdt() + _extends() + _tbp() + _poly() + _unlimited() +
2234
+ _assignfinal() + _dreduce() + _elemsec() + _acc())
2235
+ return [render(v) for v in vs]
2236
+
2237
+
2238
+ def program(pid: str) -> Program:
2239
+ for p in programs():
2240
+ if p.id == pid:
2241
+ return p
2242
+ raise KeyError(pid)
2243
+
2244
+
2245
+ def parse_observed(stdout: str) -> dict:
2246
+ """name -> integer of the ``name= value`` lines of a run."""
2247
+ import re
2248
+ return {m.group(1): int(m.group(2)) for m in
2249
+ re.finditer(r"^(\w+)= (-?\d+)\s*$", stdout or "", re.M)}