https://gcc.gnu.org/g:429628e9d38663b15b919d65ef5db8a6e85db89f

commit r16-1160-g429628e9d38663b15b919d65ef5db8a6e85db89f
Author: Steve Baird <ba...@adacore.com>
Date:   Thu Jan 30 13:28:50 2025 -0800

    ada: Exception-raising loop incorrectly eliminated
    
    If the body of a loop includes a raise statement then the loop should not be
    considered to be free of side-effects and therefore eligible for elimination
    by the compiler.
    
    gcc/ada/ChangeLog:
    
            * sem_util.adb
            (Side_Effect_Free_Statements): Return False if the statement list
            includes an explicit (i.e. Comes_From_Source) raise statement.

Diff:
---
 gcc/ada/sem_util.adb | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index ce54deaab850..97dc4c0af8b9 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -12425,9 +12425,14 @@ package body Sem_Util is
 
       while Present (Node) loop
          case Nkind (Node) is
-            when N_Null_Statement | N_Call_Marker | N_Raise_xxx_Error =>
+            when N_Null_Statement | N_Call_Marker =>
                null;
 
+            when N_Raise_xxx_Error =>
+               if Comes_From_Source (Node) then
+                  return False;
+               end if;
+
             when N_Object_Declaration =>
                if Present (Expression (Node))
                  and then not Side_Effect_Free (Expression (Node))

Reply via email to