On May 12, 2022, Pierre-Marie de Rodat <dero...@adacore.com> wrote:

> Implement and document hardened booleans, from nonstandard boolean types
> with representation clauses to the extra validity checking performed on
> boolean types annotated with the "hardbool" Machine_Attribute pragma.

And here is a test for testsuite/gnat.dg.  Tested on x86_64-linux-gnu.
I'm checking this in.


Introduce tests for hardbool Machine_Attribute for Ada

Test for the validity checking performed on nonstandard booleans
annotated with the "hardbool" Machine_Attribute pragma.


for  gcc/testsuite/ChangeLog

        * gnat.dg/hardbool.ads: New.
        * gnat.dg/hardbool.adb: New.
---
 gcc/testsuite/gnat.dg/hardbool.adb |   46 ++++++++++++++++++++++++++++++++++++
 gcc/testsuite/gnat.dg/hardbool.ads |   22 +++++++++++++++++
 2 files changed, 68 insertions(+)
 create mode 100644 gcc/testsuite/gnat.dg/hardbool.adb
 create mode 100644 gcc/testsuite/gnat.dg/hardbool.ads

diff --git a/gcc/testsuite/gnat.dg/hardbool.adb 
b/gcc/testsuite/gnat.dg/hardbool.adb
new file mode 100644
index 0000000000000..cc38af06a79b7
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/hardbool.adb
@@ -0,0 +1,46 @@
+-- { dg-do compile }
+-- { dg-options "-O -gnatVT -fdump-tree-optimized" }
+
+--  Check that we perform the expected validity checks for
+--  hardbool-annotated types, even when checking of tests is disabled.
+
+package body Hardbool is
+   function T return Boolean is (Boolean (X) and then Boolean (Y));
+
+   procedure P1 is
+   begin
+      X := HBool1 (not Y);
+   end P1;
+
+   procedure P2 is
+   begin
+      X := HBool1 (if Y then HBool2'(False) else HBool2'(True));
+   end P2;
+
+   procedure P3 is
+   begin
+      X := (if Y then HBool1'(False) else HBool1'(True));
+   end P3;
+
+   procedure Q1 is
+   begin
+      Y := HBool2 (not X);
+   end Q1;
+
+   procedure Q2 is
+   begin
+      Y := HBool2 (if X then HBool1'(False) else HBool1'(True));
+   end Q2;
+
+   procedure Q3 is
+   begin
+      Y := (if X then HBool2'(False) else HBool2'(True));
+   end Q3;
+
+end Hardbool;
+
+-- One for each type's _rep_to_pos function.
+-- { dg-final { scan-tree-dump-times "gnat_rcheck_CE_Invalid_Data 
..hardbool.ads" 2 "optimized" } }
+
+-- One check for each variable used in T, one use in each P* and in each Q*.
+-- { dg-final { scan-tree-dump-times "gnat_rcheck_CE_Invalid_Data 
..hardbool.adb" 8 "optimized" } }
diff --git a/gcc/testsuite/gnat.dg/hardbool.ads 
b/gcc/testsuite/gnat.dg/hardbool.ads
new file mode 100644
index 0000000000000..7181220a6db5d
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/hardbool.ads
@@ -0,0 +1,22 @@
+package Hardbool is
+   type HBool1 is new Boolean;
+   for HBool1'Size use 8;
+   for HBool1 use (16#5a#, 16#a5#);
+   pragma Machine_Attribute (HBool1, "hardbool");
+
+   type HBool2 is new Boolean;
+   for HBool2 use (16#0ff0#, 16#f00f#);
+   for HBool2'Size use 16;
+   pragma Machine_Attribute (HBool2, "hardbool");
+
+   X : HBool1 := False;
+   Y : HBool2 := True;
+
+   function T return Boolean;
+   procedure P1;
+   procedure P2;
+   procedure P3;
+   procedure Q1;
+   procedure Q2;
+   procedure Q3;
+end Hardbool;


-- 
Alexandre Oliva, happy hacker                https://FSFLA.org/blogs/lxo/
   Free Software Activist                       GNU Toolchain Engineer
Disinformation flourishes because many people care deeply about injustice
but very few check the facts.  Ask me about <https://stallmansupport.org>

Reply via email to