From: Steve Baird Date: Tue, 12 Mar 2024 00:45:58 +0000 (-0700) Subject: ada: Bug in computing local restrictions inherited from enclosing scopes. X-Git-Tag: basepoints/gcc-16~8940 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b5b67dc1960b4b2f72c003e747b34049a5e04a7;p=thirdparty%2Fgcc.git ada: Bug in computing local restrictions inherited from enclosing scopes. In the function Local_Restrict.Active_Restriction, we traverse enclosing scopes looking for a relevant Local_Restrictions aspect specification. Fix a bug in this traversal. gcc/ada/ * local_restrict.adb (Active_Restriction): When traversing scopes, do not skip over a subprogram body. --- diff --git a/gcc/ada/local_restrict.adb b/gcc/ada/local_restrict.adb index 6e91c8a2e2a..3be94049928 100644 --- a/gcc/ada/local_restrict.adb +++ b/gcc/ada/local_restrict.adb @@ -90,22 +90,28 @@ package body Local_Restrict is return Result; end if; - Scop := Enclosing_Declaration (Scop); - if Present (Scop) then - Scop := Parent (Scop); + declare + Saved_Scope : constant Node_Id := Scop; + begin + Scop := Enclosing_Declaration (Scop); if Present (Scop) then - -- For a subprogram associated with a type, we don't care - -- where the type was frozen; continue from the type. - - if Nkind (Scop) = N_Freeze_Entity then - Scop := Scope (Entity (Scop)); - elsif Nkind (Parent (Scop)) = N_Freeze_Entity then - Scop := Scope (Entity (Parent (Scop))); - else - Scop := Find_Enclosing_Scope (Scop); + Scop := Parent (Scop); + if Present (Scop) then + -- For a subprogram associated with a type, we don't care + -- where the type was frozen; continue from the type. + + if Nkind (Scop) = N_Freeze_Entity then + Scop := Scope (Entity (Scop)); + elsif Nkind (Parent (Scop)) = N_Freeze_Entity then + Scop := Scope (Entity (Parent (Scop))); + elsif Present (Scope (Saved_Scope)) then + Scop := Scope (Saved_Scope); + else + Scop := Find_Enclosing_Scope (Scop); + end if; end if; end if; - end if; + end; end loop; return Empty;