From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 82F483856DF0; Fri, 6 May 2022 07:18:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 82F483856DF0 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] Set_Is_Known_Valid only if Safe_To_Capture_Value X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: 4b916d8437e76146b1bdb20391b016e8461e8382 X-Git-Newrev: 8f34a56593106fdd4e8458158afcb9f52954c51c Message-Id: <20220506071854.82F483856DF0@sourceware.org> Date: Fri, 6 May 2022 07:18:54 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 May 2022 07:18:54 -0000 https://gcc.gnu.org/g:8f34a56593106fdd4e8458158afcb9f52954c51c commit 8f34a56593106fdd4e8458158afcb9f52954c51c Author: Alexandre Oliva Date: Thu Feb 17 03:12:06 2022 -0300 Set_Is_Known_Valid only if Safe_To_Capture_Value Library-level variables with initializers could have Is_Known_Valid set when analyzing their definition, and the flag would only be cleared when analyzing a statement that assigned to them. Procedures and functions analyzed before the flag got cleared could skip validity checking for the corresponding variable. This patch fixes this problem: we no longer set Is_Known_Valid when analyzing initializers of library-level variables,and use the same Safe_To_Capture_Value predicate that prevents assignments from recording known-valid states. This causes any variable with an initialization value, that would have had its initializer value used as its known constant value if the use is analyzed before any assignment to the variable, to no longer be regarded as holding a constant value. Some might turn out to have a constant value, after all, but we don't know that yet: we can only tell after analyzing every subprogram that could possibly assign to it. At the points where Safe_To_Capture_Value calls are introduced, Never_Set_In_Source does not yet hold its final value. [changelog] * exp_ch3.adb (Expand_N_Object_Declaration): Guard Set_Is_Known_Valid with Safe_To_Capture_Value. Diff: --- gcc/ada/exp_ch3.adb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 50f46fb479e..7ce297f3f3b 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -7536,6 +7536,7 @@ package body Exp_Ch3 is elsif Comes_From_Source (N) and then Is_Discrete_Type (Typ) and then Expr_Known_Valid (Expr) + and then Safe_To_Capture_Value (N, Def_Id) then Set_Is_Known_Valid (Def_Id); @@ -7566,7 +7567,9 @@ package body Exp_Ch3 is and then not Is_Generic_Type (Etype (Def_Id)) then Ensure_Valid (Expr); - Set_Is_Known_Valid (Def_Id); + if Safe_To_Capture_Value (N, Def_Id) then + Set_Is_Known_Valid (Def_Id); + end if; end if; end if;