aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorYannick Moy <moy@adacore.com>2019-12-12 12:38:19 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2020-06-02 04:58:01 -0400
commit0b8eceff72120b5378423fbc2475a95f4730edad (patch)
tree1f896405e267df442df7d1bc947927bdf595f7fa /gcc
parenta92db2624549f119a6f5c1e19c3013768b6bad3e (diff)
downloadgcc-0b8eceff72120b5378423fbc2475a95f4730edad.zip
gcc-0b8eceff72120b5378423fbc2475a95f4730edad.tar.gz
gcc-0b8eceff72120b5378423fbc2475a95f4730edad.tar.bz2
[Ada] Allow GNATprove to set overflow mode
2020-06-02 Yannick Moy <moy@adacore.com> gcc/ada/ * sem_prag.adb, sem_prag.ads (Set_Overflow_Mode): New procedure to set overflow mode.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_prag.adb62
-rw-r--r--gcc/ada/sem_prag.ads5
2 files changed, 65 insertions, 2 deletions
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 936d699..77cd051 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 88c103a..5709b3d 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;