public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
From: Marc Poulhi?s <dkm@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org
Subject: [gcc r14-4753] ada: Refactor code to remove GNATcheck violation
Date: Thu, 19 Oct 2023 14:41:27 +0000 (GMT)	[thread overview]
Message-ID: <20231019144127.A51EE3858C2F@sourceware.org> (raw)

https://gcc.gnu.org/g:c1fbfe5acbf02674c9fb411ffcccec5c6ed9a5eb

commit r14-4753-gc1fbfe5acbf02674c9fb411ffcccec5c6ed9a5eb
Author: Sheri Bernstein <bernstein@adacore.com>
Date:   Wed Aug 9 16:04:31 2023 +0000

    ada: Refactor code to remove GNATcheck violation
    
    Rewrite for loop containing an exit (which violates GNATcheck
    rule Exits_From_Conditional_Loops), to use a while loop
    which contains the exit criteria in its condition.
    Also, move special case of first time through loop, to come
    before loop.
    
    gcc/ada/
    
            * libgnat/s-imagef.adb (Set_Image_Fixed): Refactor loop.

Diff:
---
 gcc/ada/libgnat/s-imagef.adb | 75 +++++++++++++++++++++++---------------------
 1 file changed, 40 insertions(+), 35 deletions(-)

diff --git a/gcc/ada/libgnat/s-imagef.adb b/gcc/ada/libgnat/s-imagef.adb
index 3f6bfa20cb2d..6194a3163de7 100644
--- a/gcc/ada/libgnat/s-imagef.adb
+++ b/gcc/ada/libgnat/s-imagef.adb
@@ -307,6 +307,9 @@ package body System.Image_F is
       YY : Int := Y;
       --  First two operands of the scaled divide
 
+      J : Natural;
+      --  Loop index
+
    begin
       --  Set the first character like Image
 
@@ -317,59 +320,61 @@ package body System.Image_F is
          Ndigs := 0;
       end if;
 
-      for J in 1 .. N loop
-         exit when XX = 0;
+      --  First round of scaled divide
 
+      if XX /= 0 then
          Scaled_Divide (XX, YY, Z, Q, R => XX, Round => False);
+         if Q /= 0 then
+            Set_Image_Integer (Q, Digs, Ndigs);
+         end if;
 
-         if J = 1 then
-            if Q /= 0 then
-               Set_Image_Integer (Q, Digs, Ndigs);
-            end if;
-
-            Scale := Scale + D;
+         Scale := Scale + D;
 
-            --  Prepare for next round, if any
+         --  Prepare for next round, if any
 
-            YY := 10**Maxdigs;
+         YY := 10**Maxdigs;
+      end if;
 
-         else
-            pragma Assert (-10**Maxdigs < Q and then Q < 10**Maxdigs);
+      J := 2;
+      while J <= N and then XX /= 0 loop
+         Scaled_Divide (XX, YY, Z, Q, R => XX, Round => False);
 
-            Len := 0;
-            Set_Image_Integer (abs Q, Buf, Len);
+         pragma Assert (-10**Maxdigs < Q and then Q < 10**Maxdigs);
 
-            pragma Assert (1 <= Len and then Len <= Maxdigs);
+         Len := 0;
+         Set_Image_Integer (abs Q, Buf, Len);
 
-            --  If no character but the space has been written, write the
-            --  minus if need be, since Set_Image_Integer did not do it.
+         pragma Assert (1 <= Len and then Len <= Maxdigs);
 
-            if Ndigs <= 1 then
-               if Q /= 0 then
-                  if Ndigs = 0 then
-                     Digs (1) := '-';
-                  end if;
+         --  If no character but the space has been written, write the
+         --  minus if need be, since Set_Image_Integer did not do it.
 
-                  Digs (2 .. Len + 1) := Buf (1 .. Len);
-                  Ndigs := Len + 1;
+         if Ndigs <= 1 then
+            if Q /= 0 then
+               if Ndigs = 0 then
+                  Digs (1) := '-';
                end if;
 
-            --  Or else pad the output with zeroes up to Maxdigs
+               Digs (2 .. Len + 1) := Buf (1 .. Len);
+               Ndigs := Len + 1;
+            end if;
 
-            else
-               for K in 1 .. Maxdigs - Len loop
-                  Digs (Ndigs + K) := '0';
-               end loop;
+         --  Or else pad the output with zeroes up to Maxdigs
 
-               for K in 1 .. Len loop
-                  Digs (Ndigs + Maxdigs - Len + K) := Buf (K);
-               end loop;
+         else
+            for K in 1 .. Maxdigs - Len loop
+               Digs (Ndigs + K) := '0';
+            end loop;
 
-               Ndigs := Ndigs + Maxdigs;
-            end if;
+            for K in 1 .. Len loop
+               Digs (Ndigs + Maxdigs - Len + K) := Buf (K);
+            end loop;
 
-            Scale := Scale + Maxdigs;
+            Ndigs := Ndigs + Maxdigs;
          end if;
+
+         Scale := Scale + Maxdigs;
+         J := J + 1;
       end loop;
 
       --  If no digit was output, this is zero

                 reply	other threads:[~2023-10-19 14:41 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231019144127.A51EE3858C2F@sourceware.org \
    --to=dkm@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).