From 0b8eceff72120b5378423fbc2475a95f4730edad Mon Sep 17 00:00:00 2001 From: Yannick Moy Date: Thu, 12 Dec 2019 12:38:19 +0100 Subject: [PATCH] [Ada] Allow GNATprove to set overflow mode 2020-06-02 Yannick Moy gcc/ada/ * sem_prag.adb, sem_prag.ads (Set_Overflow_Mode): New procedure to set overflow mode. --- gcc/ada/sem_prag.adb | 62 ++++++++++++++++++++++++++++++++++++++++++-- gcc/ada/sem_prag.ads | 5 ++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 936d699a8b7..77cd051bfe9 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -32303,6 +32303,64 @@ package body Sem_Prag is Generate_Reference (Entity (With_Item), N, Set_Ref => False); end Set_Elab_Unit_Name; + ----------------------- + -- Set_Overflow_Mode -- + ----------------------- + + procedure Set_Overflow_Mode (N : Node_Id) is + + function Get_Overflow_Mode (Arg : Node_Id) return Overflow_Mode_Type; + -- Function to process one pragma argument, Arg + + ----------------------- + -- Get_Overflow_Mode -- + ----------------------- + + function Get_Overflow_Mode (Arg : Node_Id) return Overflow_Mode_Type is + Argx : constant Node_Id := Get_Pragma_Arg (Arg); + + begin + if Chars (Argx) = Name_Strict then + return Strict; + + elsif Chars (Argx) = Name_Minimized then + return Minimized; + + elsif Chars (Argx) = Name_Eliminated then + return Eliminated; + + else + raise Program_Error; + end if; + end Get_Overflow_Mode; + + -- Local variables + + Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N)); + Arg2 : constant Node_Id := Next (Arg1); + + -- Start of processing for Set_Overflow_Mode + + begin + -- Process first argument + + Scope_Suppress.Overflow_Mode_General := + Get_Overflow_Mode (Arg1); + + -- Case of only one argument + + if No (Arg2) then + Scope_Suppress.Overflow_Mode_Assertions := + Scope_Suppress.Overflow_Mode_General; + + -- Case of two arguments present + + else + Scope_Suppress.Overflow_Mode_Assertions := + Get_Overflow_Mode (Arg2); + end if; + end Set_Overflow_Mode; + ------------------- -- Test_Case_Arg -- ------------------- @@ -32399,9 +32457,9 @@ package body Sem_Prag is return Empty; end Test_Case_Arg; - ----------------------------------------- + -------------------------------------------- -- Defer_Compile_Time_Warning_Error_To_BE -- - ----------------------------------------- + -------------------------------------------- procedure Defer_Compile_Time_Warning_Error_To_BE (N : Node_Id) is Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N)); diff --git a/gcc/ada/sem_prag.ads b/gcc/ada/sem_prag.ads index 88c103aa9d4..5709b3d833e 100644 --- a/gcc/ada/sem_prag.ads +++ b/gcc/ada/sem_prag.ads @@ -530,6 +530,11 @@ package Sem_Prag is -- the value of the Interface_Name. Otherwise it is encoded as needed by -- particular operating systems. See the body for details of the encoding. + procedure Set_Overflow_Mode (N : Node_Id); + -- Sets Sem.Scope_Suppress according to the overflow modes specified in + -- the pragma Overflow_Mode passed in argument. This should only be called + -- after N has been successfully analyzed. + function Test_Case_Arg (Prag : Node_Id; Arg_Nam : Name_Id; -- 2.30.2