aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gnat.dg/opt31.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gnat.dg/opt31.adb')
-rw-r--r--gcc-4.9/gcc/testsuite/gnat.dg/opt31.adb43
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gnat.dg/opt31.adb b/gcc-4.9/gcc/testsuite/gnat.dg/opt31.adb
new file mode 100644
index 000000000..51aa3556c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gnat.dg/opt31.adb
@@ -0,0 +1,43 @@
+-- { dg-do run }
+-- { dg-options "-O" }
+
+with Interfaces; use Interfaces;
+with Unchecked_Conversion;
+
+procedure Opt31 is
+
+ type Unsigned_24 is new Unsigned_32 range 0 .. 2**24 - 1;
+ subtype Time_T is Unsigned_24 range 0 .. 24 * 60 * 60 * 128 - 1;
+
+ type Messages_T is array (Positive range <>) of Unsigned_8;
+ subtype T_3Bytes is Messages_T (1 .. 3);
+
+ type Rec1 is record
+ F : Time_T;
+ end record;
+ for Rec1 use record
+ F at 0 range 0 .. 23;
+ end record;
+ for Rec1'Size use 24;
+
+ type Rec2 is record
+ I1,I2,I3,I4 : Integer;
+ R1 : Rec1;
+ end record;
+
+ function Conv is new Unchecked_Conversion (T_3Bytes, Rec1);
+
+ procedure Decode (M : Messages_T) is
+ My_Rec2 : Rec2;
+ begin
+ My_Rec2.R1 := Conv (M (1 .. 3));
+ if not My_Rec2.R1.F'Valid then
+ raise Program_Error;
+ end if;
+ end;
+
+ Message : Messages_T (1 .. 4) := (16#18#, 16#0C#, 16#0C#, 16#18#);
+
+begin
+ Decode (Message);
+end;