{"id":2221617,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2221617/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/b7d9dcdd-6638-4e12-8580-89696c06fd90@gmail.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/projects/17/?format=json","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},"msgid":"<b7d9dcdd-6638-4e12-8580-89696c06fd90@gmail.com>","date":"2026-04-10T00:52:46","name":"[fortran] Fix Bug 94978 - [13/14/15/16 Regression] Bogus warning \"Array reference at (1) out of bounds ...\"","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"6d8950ae4368a500ce1e1677d142414e64131e93","submitter":{"id":78264,"url":"http://patchwork.ozlabs.org/api/1.1/people/78264/?format=json","name":"Jerry D","email":"jvdelisle2@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/b7d9dcdd-6638-4e12-8580-89696c06fd90@gmail.com/mbox/","series":[{"id":499374,"url":"http://patchwork.ozlabs.org/api/1.1/series/499374/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=499374","date":"2026-04-10T00:52:46","name":"[fortran] Fix Bug 94978 - [13/14/15/16 Regression] Bogus warning \"Array reference at (1) out of bounds ...\"","version":1,"mbox":"http://patchwork.ozlabs.org/series/499374/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2221617/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2221617/checks/","tags":{},"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=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=UsiIZp7B;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.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=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=UsiIZp7B","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=none smtp.remote-ip=209.85.216.43"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.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 4fsJFY5vfZz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 10:53:19 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 536174BA2E15\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 00:53:17 +0000 (GMT)","from mail-pj1-f43.google.com (mail-pj1-f43.google.com\n [209.85.216.43])\n by sourceware.org (Postfix) with ESMTPS id 605BA4BA2E0F\n for <gcc-patches@gcc.gnu.org>; Fri, 10 Apr 2026 00:52:49 +0000 (GMT)","by mail-pj1-f43.google.com with SMTP id\n 98e67ed59e1d1-358d80f60ccso1087554a91.3\n for <gcc-patches@gcc.gnu.org>; Thu, 09 Apr 2026 17:52:49 -0700 (PDT)","from [10.168.168.66] ([50.37.179.80])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35e4122344esm1053619a91.7.2026.04.09.17.52.47\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 09 Apr 2026 17:52:47 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 536174BA2E15","OpenDKIM Filter v2.11.0 sourceware.org 605BA4BA2E0F"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 605BA4BA2E0F","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 605BA4BA2E0F","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775782369; cv=none;\n b=MuaPj0n6jlYduulhRV1UVsYQ/lCG8YPasT5rvJxo5uv/3WN0XbZto7OPTK5cJVNeYQe1NeO0brH9QU0qzalDFKSrwZslZlMHbLDaZoUSRZxDA2Qv+Md44ZzFo2ZB7hi0fi04YiRXhuPUq7m3s17uRh+2tPhti1fylAgBuSw51Q4=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775782369; c=relaxed/simple;\n bh=ZXOX817gdAbcJu1U2hOhvlic4TaVzRgfWo/6unCAVxc=;\n h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject;\n b=NlxqYTxgfOHve0vyXmligCyWugrgrcITnHv2OmFJ9lVWd5xOTbHYeR9YywkbmARZ63Ts35bSL5OTR1GqqY/fnsmyLGmdsrjPCADhILZY9fIFu/TNn1WYxO7n/P5CWh7hSl6gB/6iEkFP0oRtZqT5or95tef5VO5HfCa7nPxS3pI=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775782368; x=1776387168; darn=gcc.gnu.org;\n h=autocrypt:subject:from:cc:to:content-language:user-agent\n :mime-version:date:message-id:from:to:cc:subject:date:message-id\n :reply-to; bh=q3/0TSgD0wIBpZor8WDc3NDyzUNTgraMQbWFLFsSP7o=;\n b=UsiIZp7BrEhfDh5+9DipcUVzQdGKZGP7ECNjAMStFiVdV3tpAU4O/M5SReMPnzn66a\n +m0W1vqTwzeL4dYj1yF+cxLhsBup1a4StSUDOpUgc7aVFmD09ykufj3UHvA4S69zdt6U\n DWHdg1IUh69oftjA/M0BQlooGx9W5L8QZBhM7zE7+UXhtL8Kbpp+ssAMkdmI/2w5SwjI\n 0MwExx0uCocC0cO+efs7iK5Q8FX2riMa4//WUzngzbP2TXZChoXWOBbfK2+I81NhOaI6\n /tZAhPNXunE3d828RknMgvWaTBymTelNjVxZKN348idJoVkqbg2lSSUSXRjUIjevKUI2\n DTFQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775782368; x=1776387168;\n h=autocrypt:subject:from:cc:to:content-language:user-agent\n :mime-version:date:message-id:x-gm-gg:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=q3/0TSgD0wIBpZor8WDc3NDyzUNTgraMQbWFLFsSP7o=;\n b=YQeFMjgSQ6gjJTDiSmjkbVyr7bUzOzL4RovXwXe92I5gA+pZwELwbFroDFrulhPg50\n l1WxRADPpzwu+s1tY5yOqkhly02xJ455+ofa7awQW4csWqtfnYCYW1JWj1Qg7T5XUOXK\n KwiBhdzNSVOa0cv9wqlS83MiFnqH7DhIQosN9BEPmp2OYpJ6XpJbu/rQc8JMCcmZFCka\n fU00YdAe/Zbp5gTB/Yz7SKQtEPl7EL1dPuttTuV0WjC3evXp3MWnP7qwjcqcWvTeiX6y\n 08AD9tB2lsf98VCFgpcHnCYOKrtNLxlk1QnEV8QOSDj8uz6BrjK65iGwfDK7ZC2VFtXk\n Q85Q==","X-Forwarded-Encrypted":"i=1;\n AJvYcCWnuIok7MeqxlKWKbqQnqxd+kC7xlru0316PRYfe7vxQkUoaZRA0cEo2YhZ44BDJNPJWygRiFxxnzTbtQ==@gcc.gnu.org","X-Gm-Message-State":"AOJu0YwyoIL2+/maJXzjCmcqdIBRrMoQEyF+CC1qlj6NSLCqvReZXsKP\n f/grN2W+jXOJx5HE5Gs4Sk5Ns1zf6vTUXq3QfZKnNCQjNFBqqhCxm9PA","X-Gm-Gg":"AeBDieutbqxEVsciFvDMl8JeAgUFm6EsV/on74JqBlZgvg0OEEWjBRI/4dJPfBQ2O5G\n 8qDQIbuCPIadFEiv/WCeNFeV8w/Tz7YIgEPDN4Zo24d1ghlQr537SELWP+/69DJe5PSDaXhz7Zp\n hEGz/XqDiVT/Ku62wI7IMUGyxmaGPborfm0HhmhLPcyAhQFrtX0E67CWx1eTUxo4dv7eCgIn3mX\n pSrCNgyrC+aprGlfKM1DnUDVBQavBzT0tY2mxJi2/4fkDdNGl/Xa+RA5eaQ/dh0PFqFW/BIngxN\n TOdWENa1BtIrdpF/qNVcnpAdEQm1qO99sTW3xJ7Vm+Oab5ocPQegcSrDYfL7QxNP+5Irj0TQoBZ\n sMYF5ozI/EYoGdI4ROHjg3AixhBsHcxoXQ0aHT2egcUn3NNq/FBOeUTdhESPXQtO5cErrxvd2O4\n fBer3LbHDOmizFmSIPyKU1cnz9B4Y=","X-Received":"by 2002:a17:90b:4d10:b0:35b:e553:9cc2 with SMTP id\n 98e67ed59e1d1-35e42847a40mr1209590a91.26.1775782368107;\n Thu, 09 Apr 2026 17:52:48 -0700 (PDT)","Content-Type":"multipart/mixed; boundary=\"------------cWDi5lzKEf00OHHDaALvKp2c\"","Message-ID":"<b7d9dcdd-6638-4e12-8580-89696c06fd90@gmail.com>","Date":"Thu, 9 Apr 2026 17:52:46 -0700","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Content-Language":"en-US","To":"gfortran <fortran@gcc.gnu.org>, gcc-patches <gcc-patches@gcc.gnu.org>","Cc":"Harald Anlauf <anlauf@gmx.de>, Thomas Koenig <tkoenig@netcologne.de>,\n Paul Richard Thomas <paul.richard.thomas@gmail.com>","From":"Jerry D <jvdelisle2@gmail.com>","Subject":"[PATCH,fortran] Fix Bug 94978 - [13/14/15/16 Regression] Bogus\n warning \"Array reference at (1) out of bounds ...\"","Autocrypt":"addr=jvdelisle2@gmail.com; keydata=\n xjMEY5TlkxYJKwYBBAHaRw8BAQdAyrkRDhmJhSTTlV/50gJLlvliU6/Lm5C9ViKV8T9y1GnN\n HkplcnJ5IEQgPGp2ZGVsaXNsZTJAZ21haWwuY29tPsKJBBMWCAAxFiEEOFR0TS0390uh8dRV\n uWXAJaWpwWoFAmOU5ZMCGwMECwkIBwUVCAkKCwUWAgMBAAAKCRC5ZcAlpanBalsJAP4wdCiH\n 2Of9oZv1QWgZ/AVdbWFM3Fv47/WZQHOXfoZ9HgD6AkXrKeJ+6usST7PEaDJjptaViT1fLiYY\n V/6XaOKSsgLOOARjlOWTEgorBgEEAZdVAQUBAQdAdA7PczYnl07vnOT9oP/wvvMDd4HP09Zl\n g3LzwXQJWT8DAQgHwngEGBYIACAWIQQ4VHRNLTf3S6Hx1FW5ZcAlpanBagUCY5TlkwIbDAAK\n CRC5ZcAlpanBasF/AQCa5WjlsVpLsEiggZyT18MOJNAdeRd7wkGDUrwedHrvawD/cE1H+/Ms\n L1ZwvQiLfGdx8crigQqWTQyos4kH8Wx82wc=","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":"Hi all,\n\nThe attached patch avoids the bogus warning. I completed regression testing on \nx86_64.\n\nI would appreciate others to take a look.\n\nOK to commit on mainline?\n\nRegards,\n\nJerry\n---\n\nfortran: Avoid bogus do-subscript warnings in skipped inner\n  loops [PR94978]\n\nDo not warn from an outer-loop bound substitution when a nested inner loop may\nbe zero-trip after that substitution, because the guarded array reference may\nthen be unreachable.\n\ngcc/fortran/ChangeLog:\n\n\tPR fortran/94978\n\t* frontend-passes.cc (evaluate_loop_bound): New helper.\n\t(inner_loop_may_be_skipped): New helper.\n\t(do_subscript): Skip outer-loop bound warnings when nested inner loops\n\tmay be zero-trip for the substituted bound.\n\ngcc/testsuite/ChangeLog:\n\n\tPR fortran/94978\n\t* gfortran.dg/pr94978.f90: New test.\n\nSigned-off-by: Christopher Albert <albert@tugraz.at>","diff":"From f87d2443e27cafde0de1923cd186be92f9cef2a0 Mon Sep 17 00:00:00 2001\nFrom: Christopher Albert <albert@tugraz.at>\nDate: Sat, 28 Mar 2026 17:26:05 +0100\nSubject: [PATCH] fortran: Avoid bogus do-subscript warnings in skipped inner\n loops [PR94978]\n\nDo not warn from an outer-loop bound substitution when a nested inner loop may\nbe zero-trip after that substitution, because the guarded array reference may\nthen be unreachable.\n\ngcc/fortran/ChangeLog:\n\n\tPR fortran/94978\n\t* frontend-passes.cc (evaluate_loop_bound): New helper.\n\t(inner_loop_may_be_skipped): New helper.\n\t(do_subscript): Skip outer-loop bound warnings when nested inner loops\n\tmay be zero-trip for the substituted bound.\n\ngcc/testsuite/ChangeLog:\n\n\tPR fortran/94978\n\t* gfortran.dg/pr94978.f90: New test.\n\nSigned-off-by: Christopher Albert <albert@tugraz.at>\n---\n gcc/fortran/frontend-passes.cc        | 69 ++++++++++++++++++++++++++-\n gcc/testsuite/gfortran.dg/pr94978.f90 | 24 ++++++++++\n 2 files changed, 91 insertions(+), 2 deletions(-)\n create mode 100644 gcc/testsuite/gfortran.dg/pr94978.f90\n\ndiff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc\nindex 56d8e21b9f4..fa508794e20 100644\n--- a/gcc/fortran/frontend-passes.cc\n+++ b/gcc/fortran/frontend-passes.cc\n@@ -2746,6 +2746,66 @@ insert_index (gfc_expr *e, gfc_symbol *sym, mpz_t val, mpz_t ret)\n \n }\n \n+static bool\n+evaluate_loop_bound (gfc_expr *e, gfc_symbol *sym, mpz_t val, mpz_t ret)\n+{\n+  if (e->expr_type == EXPR_CONSTANT)\n+    {\n+      mpz_init_set (ret, e->value.integer);\n+      return true;\n+    }\n+\n+  return insert_index (e, sym, val, ret);\n+}\n+\n+/* Return true if any loop nested inside LOOP_INDEX is not provably entered\n+   after substituting OUTER_VAL for OUTER_SYM.  In that case the guarded array\n+   reference may never be evaluated, so do not warn from the outer loop alone.  */\n+\n+static bool\n+inner_loop_may_be_skipped (int loop_index, gfc_symbol *outer_sym, mpz_t outer_val)\n+{\n+  int k;\n+  do_t *lp;\n+\n+  FOR_EACH_VEC_ELT_FROM (doloop_list, k, lp, loop_index + 1)\n+    {\n+      gfc_code *loop = lp->c;\n+      int sgn, cmp;\n+      mpz_t do_start, do_end, do_step;\n+\n+      if (loop == NULL || loop->ext.iterator == NULL || loop->ext.iterator->var == NULL)\n+\treturn true;\n+\n+      if (!evaluate_loop_bound (loop->ext.iterator->step, outer_sym, outer_val, do_step))\n+\treturn true;\n+\n+      sgn = mpz_cmp_ui (do_step, 0);\n+      if (sgn == 0)\n+\t{\n+\t  mpz_clear (do_step);\n+\t  return true;\n+\t}\n+\n+      if (!evaluate_loop_bound (loop->ext.iterator->start, outer_sym, outer_val, do_start)\n+\t  || !evaluate_loop_bound (loop->ext.iterator->end, outer_sym, outer_val, do_end))\n+\t{\n+\t  mpz_clear (do_step);\n+\t  return true;\n+\t}\n+\n+      cmp = mpz_cmp (do_end, do_start);\n+      mpz_clear (do_start);\n+      mpz_clear (do_end);\n+      mpz_clear (do_step);\n+\n+      if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0))\n+\treturn true;\n+    }\n+\n+  return false;\n+}\n+\n /* Check array subscripts for possible out-of-bounds accesses in DO\n    loops with constant bounds.  */\n \n@@ -2880,10 +2940,15 @@ do_subscript (gfc_expr **e)\n \t\t  mpz_clear (rem);\n \t\t}\n \n+\t      bool skip_start = have_do_start\n+\t\t\t\t&& inner_loop_may_be_skipped (j, do_sym, do_start);\n+\t      bool skip_end = have_do_end\n+\t\t\t      && inner_loop_may_be_skipped (j, do_sym, do_end);\n+\n \t      for (i = 0; i< ar->dimen; i++)\n \t\t{\n \t\t  mpz_t val;\n-\t\t  if (ar->dimen_type[i] == DIMEN_ELEMENT && have_do_start\n+\t\t  if (ar->dimen_type[i] == DIMEN_ELEMENT && have_do_start && !skip_start\n \t\t      && insert_index (ar->start[i], do_sym, do_start, val))\n \t\t    {\n \t\t      if (ar->as->lower[i]\n@@ -2909,7 +2974,7 @@ do_subscript (gfc_expr **e)\n \t\t      mpz_clear (val);\n \t\t    }\n \n-\t\t  if (ar->dimen_type[i] == DIMEN_ELEMENT && have_do_end\n+\t\t  if (ar->dimen_type[i] == DIMEN_ELEMENT && have_do_end && !skip_end\n \t\t      && insert_index (ar->start[i], do_sym, do_end, val))\n \t\t    {\n \t\t      if (ar->as->lower[i]\ndiff --git a/gcc/testsuite/gfortran.dg/pr94978.f90 b/gcc/testsuite/gfortran.dg/pr94978.f90\nnew file mode 100644\nindex 00000000000..5d64d227fdc\n--- /dev/null\n+++ b/gcc/testsuite/gfortran.dg/pr94978.f90\n@@ -0,0 +1,24 @@\n+! { dg-do compile }\n+! { dg-options \"-Wdo-subscript\" }\n+\n+implicit none\n+\n+integer(4) :: i, j\n+integer(4) :: pascal(0:8, 0:8)\n+\n+do i = 0, 8\n+  pascal(i, 0) = 1\n+  do j = 1, i - 1\n+    pascal(i, j) = pascal(i - 1, j) + pascal(i - 1, j - 1) ! { dg-bogus \"Array reference at \\\\(1\\\\) out of bounds\" }\n+  end do\n+  do j = i, 8\n+    pascal(i, j) = 0\n+  end do\n+  pascal(i, i) = 1\n+end do\n+\n+do i = 0, 8\n+  print '(9I4)', pascal(i, :)\n+end do\n+\n+end\n-- \n2.53.0\n\n","prefixes":["fortran"]}