Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2237911/?format=api
{ "id": 2237911, "url": "http://patchwork.ozlabs.org/api/patches/2237911/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/ebd7aad6-8534-4c8b-b816-0dbba0d30a7e@baylibre.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<ebd7aad6-8534-4c8b-b816-0dbba0d30a7e@baylibre.com>", "list_archive_url": null, "date": "2026-05-13T14:50:49", "name": "[OpenMP,Fortran] PR122910 fix POINTER array mis-privatization", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "c25527debe09d07adadcfa49df0bdfc7633792c5", "submitter": { "id": 87913, "url": "http://patchwork.ozlabs.org/api/people/87913/?format=api", "name": "Chung-Lin Tang", "email": "cltang@baylibre.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/ebd7aad6-8534-4c8b-b816-0dbba0d30a7e@baylibre.com/mbox/", "series": [ { "id": 504175, "url": "http://patchwork.ozlabs.org/api/series/504175/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=504175", "date": "2026-05-13T14:50:49", "name": "[OpenMP,Fortran] PR122910 fix POINTER array mis-privatization", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/504175/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2237911/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2237911/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=baylibre-com.20251104.gappssmtp.com\n header.i=@baylibre-com.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=RJevebum;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=baylibre-com.20251104.gappssmtp.com\n header.i=@baylibre-com.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=RJevebum", "sourceware.org;\n dmarc=none (p=none dis=none) header.from=baylibre.com", "sourceware.org; spf=pass smtp.mailfrom=baylibre.com", "sourceware.org;\n arc=none smtp.remote-ip=2607:f8b0:4864:20::1032" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4gFxJS5RNCz1y5L\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 14 May 2026 00:52:23 +1000 (AEST)", "from vm01.sourceware.org (localhost [IPv6:::1])\n\tby sourceware.org (Postfix) with ESMTP id 81AB44BB5911\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 13 May 2026 14:52:21 +0000 (GMT)", "from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com\n [IPv6:2607:f8b0:4864:20::1032])\n by sourceware.org (Postfix) with ESMTPS id 71F1B4BB588C\n for <gcc-patches@gcc.gnu.org>; Wed, 13 May 2026 14:50:55 +0000 (GMT)", "by mail-pj1-x1032.google.com with SMTP id\n 98e67ed59e1d1-36900945df5so463698a91.0\n for <gcc-patches@gcc.gnu.org>; Wed, 13 May 2026 07:50:55 -0700 (PDT)", "from [192.168.50.226] (112-104-14-82.adsl.dynamic.seed.net.tw.\n [112.104.14.82]) by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-368edf4d92asm3534926a91.8.2026.05.13.07.50.51\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Wed, 13 May 2026 07:50:52 -0700 (PDT)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 81AB44BB5911", "OpenDKIM Filter v2.11.0 sourceware.org 71F1B4BB588C" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 71F1B4BB588C", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 71F1B4BB588C", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1778683855; cv=none;\n b=j+kwlpa+LiyyD1kGhuoZ1cHo45XUdu/vMamPZa+N/awsDIpp/x8o3Etah9jphLKTR9IQni7UfDCL1aCU9u/I7q+MRhTenwv3rbuJDix88L8FQb5zbtMv+YRYpQnjS0suYkj50wgLoazUrn7vnm/VbQJEqJVat3rKdcLPpUbkWPY=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1778683855; c=relaxed/simple;\n bh=azjtr4E1d93WLOtLwULU1G6XVaewg66tHTCz94QGAcU=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject;\n b=ww8GcLIXW4d//cYLzr0pgeyN18szmIjB/h4I9axS6LgLwr1h7Z2X1giU7CEGoDiPswM+QXcBcmqnMetRGqtM1PTbr205FA0okovrx7kefHXQ1/lQ08YB28SwfUaGCc2eq4lZyXguZp3NYpZNEUBvPhYUASTyFbW9lsOAcRHABlg=", "ARC-Authentication-Results": "i=1; sourceware.org;\n dkim=pass (2048-bit key, unprotected)\n header.d=baylibre-com.20251104.gappssmtp.com\n header.i=@baylibre-com.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=RJevebum", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=baylibre-com.20251104.gappssmtp.com; s=20251104; t=1778683853;\n x=1779288653;\n darn=gcc.gnu.org;\n h=subject:from:to:content-language:user-agent:mime-version:date\n :message-id:from:to:cc:subject:date:message-id:reply-to;\n bh=hFHwrrNuDIWxXNB81hI6CN6aBTIUjbTjpL+CTN0v8Kk=;\n b=RJevebumQYHUbQEH+7CBoovPsdSjTLlc5ORXrz8WqumqNMA4ZTNlfqewo2eDosqLuS\n MdlGL0WiCDdWPLnxQpQJijtPw2vIItABL5EsQM1WQCT/igrCQxGLQl4eATScQUV4mzkT\n LlC97QN9ArzC1p6AOdNk8w4SbzBBHgKwyx6YzWjUVW03rmwmlCFZURF5SPv3Bq+DOsyb\n fTCyxpMrAjoIuRN54CgQmZqSdZJN0IIfyzQgSGqWk+Z0MuHTnU2r0ysCdbWA+tFFLZH6\n Duqjc0OJDivKM0g9M4GnEME50rQ4zXWUUDaMKcl76A3EnIyX9st6FiHe6WcbUe3GckS4\n kIfQ==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1778683853; x=1779288653;\n h=subject:from:to:content-language:user-agent:mime-version:date\n :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=hFHwrrNuDIWxXNB81hI6CN6aBTIUjbTjpL+CTN0v8Kk=;\n b=DTwo2emS3sBVNe25aKddDybuaKtbU9H8YBfFiREdfJDWOWrdzGu2a6vAkQ5BjhceYs\n MN/z3vaTEnnrEy3d3TEK8Q6wOLfD2l7BmNRCzNhSAux4Fh5pW46rJUgmLHuZQ9sXDCmP\n 5qHhVThS/+ja6mAAaWcS/oYLjq0WGYuFr+iQ7r5RJQc4+9UHfOqHIeUDjV71s/1WuZKe\n sidGNfHsSDv2ycSAairTWW0B0IBf1VXrUKAAQkqxiFpxINQWx+d1irpSK+3fozj/50qb\n kFSHjMEIqrSvXnDKgZQaE1GKKZTAVTVWFEQrdq6mNAYDNnY4yPC9eqQLe30IfG4iYIx7\n VGRg==", "X-Gm-Message-State": "AOJu0YwyDCakLPhRAwA/E1oK11Bp/B7MF2AT5ES9NmX1RECeiTVNuCnJ\n YzMqV1ZVkIuwpsl9NaFDpiQBsSnxGPKLCwqyTm+AW3Pg+8weedXj+CrUdflkbz61Ef6bfgR+yGc\n vNQdOkKc=", "X-Gm-Gg": "Acq92OFd1DMzqQ7yiGfHgkWEBqezjH6tpg+0lvmMdHY32sfevZZLLQwF3t+UnI/WIpL\n 9XWiIs1eiBsk/vN00ICTfbKc4u5jm8ym4YfypXvZa1S2Z0W42aEChxpPT4oMOkWzzNlFxi3xeTb\n b8j1jKNQpYWm/t9HB9jdoOcdy80PdJJJEZTkxox4g6Z8zPfP+4WfbGUbziQGCFldwILjqgQz0Dx\n ONakSKRqK1n7a7BtMyqRO8olJbxlu9D5VAHr8pCY7Cx1G1FlEbymRdPqLQWFkZaZOCMSJZE+Xyz\n XN4PjNxGgBNWFT+7DSorvOLBwWxkdKylBrqQUIz49YwzALRbSuawMoh91re+g3KPmP5jFaT533Y\n UBrKU3JWEbNqOB4khtmOE4eTWN7MaYb9PV/XiqXxinFcGjIOtPKZZXTbCZH+poyzctUfsYwpZ/J\n RFty1yS79F0mfdrp30LoZ0L20BiHFkfvgF0W0pvFNyVRrDzN/9iOnnnM2c2Wk5s9/HqFUG1Yutt\n Dgk/El2", "X-Received": "by 2002:a17:90a:ce:b0:369:971:4883 with SMTP id\n 98e67ed59e1d1-36909714b92mr1195910a91.17.1778683853460;\n Wed, 13 May 2026 07:50:53 -0700 (PDT)", "Content-Type": "multipart/mixed; boundary=\"------------A3Oz0JNhL7LPO0g57WHluSag\"", "Message-ID": "<ebd7aad6-8534-4c8b-b816-0dbba0d30a7e@baylibre.com>", "Date": "Wed, 13 May 2026 22:50:49 +0800", "MIME-Version": "1.0", "User-Agent": "Mozilla Thunderbird", "Content-Language": "en-US", "To": "gcc-patches <gcc-patches@gcc.gnu.org>,\n Tobias Burnus <tburnus@baylibre.com>, gfortran <fortran@gcc.gnu.org>", "From": "Chung-Lin Tang <cltang@baylibre.com>", "Subject": "[PATCH, OpenMP, Fortran] PR122910 fix POINTER array mis-privatization", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "This patch fixes a case where POINTER attribute arrays are deep copied when not supposed to.\n\nThis creates a new langhook 'omp_array_data_privatize' to differentiate cases in certain\nplaces during omp-low.\n\nStill under final testing. Okay for mainline if everything passes?\n\nThanks,\nChung-Lin\n\ngcc/fortran/ChangeLog:\n\n * f95-lang.cc (LANG_HOOKS_OMP_ARRAY_DATA_PRIVATIZE): Define as\n gfc_omp_array_data_privatize.\n * trans-openmp.cc (gfc_omp_array_data_privatize): New function.\n * trans.h (gfc_omp_array_data_privatize): New declaration.\n\ngcc/ChangeLog:\n\n * langhooks-def.h (LANG_HOOKS_OMP_ARRAY_DATA_PRIVATIZE): Define.\n * langhooks.h (struct lang_hooks_for_decls): Define\n omp_array_data_privatize hook.\n * omp-low.cc (scan_sharing_clauses): Add new calls to\n lang_hooks.decls.omp_array_data_privatize,\n (lower_omp_target): Likewise.\n\nlibgomp/ChangeLog:\n\n * testsuite/libgomp.fortran/pr122910.f90: New test.", "diff": "diff --git a/gcc/fortran/f95-lang.cc b/gcc/fortran/f95-lang.cc\nindex 45aab34865f..12ab1d251da 100644\n--- a/gcc/fortran/f95-lang.cc\n+++ b/gcc/fortran/f95-lang.cc\n@@ -135,6 +135,7 @@ gfc_get_sarif_source_language (const char *)\n #undef LANG_HOOKS_TYPE_FOR_SIZE\n #undef LANG_HOOKS_INIT_TS\n #undef LANG_HOOKS_OMP_ARRAY_DATA\n+#undef LANG_HOOKS_OMP_ARRAY_DATA_PRIVATIZE\n #undef LANG_HOOKS_OMP_ARRAY_SIZE\n #undef LANG_HOOKS_OMP_IS_ALLOCATABLE_OR_PTR\n #undef LANG_HOOKS_OMP_CHECK_OPTIONAL_ARGUMENT\n@@ -178,6 +179,7 @@ gfc_get_sarif_source_language (const char *)\n #define LANG_HOOKS_TYPE_FOR_SIZE\tgfc_type_for_size\n #define LANG_HOOKS_INIT_TS\t\tgfc_init_ts\n #define LANG_HOOKS_OMP_ARRAY_DATA\t\tgfc_omp_array_data\n+#define LANG_HOOKS_OMP_ARRAY_DATA_PRIVATIZE\tgfc_omp_array_data_privatize\n #define LANG_HOOKS_OMP_ARRAY_SIZE\t\tgfc_omp_array_size\n #define LANG_HOOKS_OMP_IS_ALLOCATABLE_OR_PTR\tgfc_omp_is_allocatable_or_ptr\n #define LANG_HOOKS_OMP_CHECK_OPTIONAL_ARGUMENT\tgfc_omp_check_optional_argument\ndiff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc\nindex b9c09d114b7..e64fa82a238 100644\n--- a/gcc/fortran/trans-openmp.cc\n+++ b/gcc/fortran/trans-openmp.cc\n@@ -176,6 +176,24 @@ gfc_omp_array_data (tree decl, bool type_only)\n return decl;\n }\n \n+/* Returns true if it is an array descriptor where the data is to be copied\n+ and privatized. Assumes the above 'omp_array_data' to already be true\n+ (hence the assertion of descriptor type here). */\n+\n+bool\n+gfc_omp_array_data_privatize (tree decl)\n+{\n+ tree type = TREE_TYPE (decl);\n+\n+ if (POINTER_TYPE_P (type))\n+ type = TREE_TYPE (type);\n+\n+ gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));\n+\n+ return (GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_POINTER\n+\t && GFC_TYPE_ARRAY_AKIND (type) != GFC_ARRAY_POINTER_CONT);\n+}\n+\n /* Return the byte-size of the passed array descriptor. */\n \n tree\ndiff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h\nindex f97fefd2ac0..0bdee5820fd 100644\n--- a/gcc/fortran/trans.h\n+++ b/gcc/fortran/trans.h\n@@ -827,6 +827,7 @@ tree gfc_omp_call_is_alloc (tree);\n bool gfc_omp_is_allocatable_or_ptr (const_tree);\n tree gfc_omp_check_optional_argument (tree, bool);\n tree gfc_omp_array_data (tree, bool);\n+bool gfc_omp_array_data_privatize (tree);\n tree gfc_omp_array_size (tree, gimple_seq *);\n bool gfc_omp_privatize_by_reference (const_tree);\n enum omp_clause_default_kind gfc_omp_predetermined_sharing (tree);\ndiff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h\nindex fc409ec08b9..33a99266187 100644\n--- a/gcc/langhooks-def.h\n+++ b/gcc/langhooks-def.h\n@@ -263,6 +263,7 @@ extern tree lhd_unit_size_without_reusable_padding (tree);\n #define LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS NULL\n #define LANG_HOOKS_DECL_OK_FOR_SIBCALL\tlhd_decl_ok_for_sibcall\n #define LANG_HOOKS_OMP_ARRAY_DATA\thook_tree_tree_bool_null\n+#define LANG_HOOKS_OMP_ARRAY_DATA_PRIVATIZE hook_bool_tree_false\n #define LANG_HOOKS_OMP_ARRAY_SIZE\tlhd_omp_array_size\n #define LANG_HOOKS_OMP_IS_ALLOCATABLE_OR_PTR hook_bool_const_tree_false\n #define LANG_HOOKS_OMP_CHECK_OPTIONAL_ARGUMENT hook_tree_tree_bool_null\n@@ -305,7 +306,8 @@ extern tree lhd_unit_size_without_reusable_padding (tree);\n LANG_HOOKS_POST_COMPILATION_PARSING_CLEANUPS, \\\n LANG_HOOKS_DECL_OK_FOR_SIBCALL, \\\n LANG_HOOKS_OMP_ARRAY_DATA, \\\n- LANG_HOOKS_OMP_ARRAY_SIZE, \\\n+ LANG_HOOKS_OMP_ARRAY_DATA_PRIVATIZE, \\\n+ LANG_HOOKS_OMP_ARRAY_SIZE,\t\t\\\n LANG_HOOKS_OMP_IS_ALLOCATABLE_OR_PTR, \\\n LANG_HOOKS_OMP_CHECK_OPTIONAL_ARGUMENT, \\\n LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE, \\\ndiff --git a/gcc/langhooks.h b/gcc/langhooks.h\nindex 6eb5c1602f8..aa983165ab5 100644\n--- a/gcc/langhooks.h\n+++ b/gcc/langhooks.h\n@@ -243,6 +243,10 @@ struct lang_hooks_for_decls\n is true, only the TREE_TYPE is returned without generating a new tree. */\n tree (*omp_array_data) (tree, bool);\n \n+ /* Return true if the data of an array descriptor is to be copied and\n+ privatized. Assumes omp_array_data returns non-NULL_TREE. */\n+ bool (*omp_array_data_privatize) (tree);\n+\n /* Return a tree for the actual data of an array descriptor - or NULL_TREE\n if original tree is not an array descriptor. If the second argument\n is true, only the TREE_TYPE is returned without generating a new tree. */\ndiff --git a/gcc/omp-low.cc b/gcc/omp-low.cc\nindex b93012107f1..79228b6350a 100644\n--- a/gcc/omp-low.cc\n+++ b/gcc/omp-low.cc\n@@ -1443,7 +1443,8 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)\n \t if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE\n \t && is_gimple_omp_offloaded (ctx->stmt)\n \t && !is_gimple_omp_oacc (ctx->stmt)\n-\t && lang_hooks.decls.omp_array_data (decl, true))\n+\t && lang_hooks.decls.omp_array_data (decl, true)\n+\t && lang_hooks.decls.omp_array_data_privatize (decl))\n \t {\n \t install_var_field (decl, false, 16 | 3, ctx);\n \t install_var_field (decl, true, 8 | 3, ctx);\n@@ -13046,7 +13047,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)\n \t }\n \t /* Fortran array descriptors: firstprivate of data + attach. */\n \t if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_HAS_DEVICE_ADDR\n-\t && lang_hooks.decls.omp_array_data (var, true))\n+\t && lang_hooks.decls.omp_array_data (var, true)\n+\t && lang_hooks.decls.omp_array_data_privatize (var))\n \t map_cnt += 2;\n \n do_dtor:\n@@ -13725,7 +13727,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)\n \t\t\t\t build_int_cstu (tkind_type, tkind));\n \t /* Fortran array descriptors: firstprivate of data + attach. */\n \t if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_HAS_DEVICE_ADDR\n-\t\t&& lang_hooks.decls.omp_array_data (ovar, true))\n+\t\t&& lang_hooks.decls.omp_array_data (ovar, true)\n+\t\t&& lang_hooks.decls.omp_array_data_privatize (ovar))\n \t {\n \t\ttree not_null_lb, null_lb, after_lb;\n \t\ttree var1, var2, size1, size2;\ndiff --git a/libgomp/testsuite/libgomp.fortran/pr122910.f90 b/libgomp/testsuite/libgomp.fortran/pr122910.f90\nnew file mode 100644\nindex 00000000000..6081dfa4ea9\n--- /dev/null\n+++ b/libgomp/testsuite/libgomp.fortran/pr122910.f90\n@@ -0,0 +1,23 @@\n+! { dg-do run { target { ! offload_device } } }\n+\n+program main\n+ implicit none\n+\n+ !$omp requires self_maps\n+\n+ integer :: i\n+ INTEGER, POINTER :: fptr(:)\n+ integer, parameter :: N = 5\n+\n+ ALLOCATE(fptr(N))\n+ fptr = 0\n+\n+ !$omp target firstprivate(fptr)\n+ DO i=1, N\n+ fptr(i) = 5*i\n+ END DO\n+ !$omp end target\n+\n+ if (any (fptr /= 5*[1,2,3,4,5])) stop 1\n+\n+end program\n", "prefixes": [ "OpenMP", "Fortran" ] }