aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gnat.dg/sso1.adb
blob: 1b2cd5f17073a59a9ef71213678dc17cd515faa1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
-- { dg-do run }

with System;
with Ada.Unchecked_Conversion;
with Ada.Streams; use Ada.Streams;
with Ada.Text_IO;

procedure SSO1 is

   type Unsigned_Integer_4 is mod 2 ** 32;
   for Unsigned_Integer_4'Size use 32;

   Default_Bit_Order_Pos : constant Natural := System.Bit_Order'Pos (System.Default_Bit_Order);

   Opposite_Bit_Order_Pos : constant Natural := 1 - Default_Bit_Order_Pos;

   Opposite_Bit_Order : constant System.Bit_Order := System.Bit_Order'Val (Opposite_Bit_Order_Pos);

   type Rec is
      record
	 X, Y : Unsigned_Integer_4;
      end record;
   for Rec'Bit_Order use System.Default_Bit_Order;
   for Rec'Scalar_Storage_Order use System.Default_Bit_Order;

   for Rec use
      record
	 X at 0 * 4 range 0 .. 31;
	 Y at 1 * 4 range 0 .. 31;
      end record;
   
   type Nested_Rec is
      record 
	 I : Unsigned_Integer_4;
	 R : Rec;
	 J : Unsigned_Integer_4;
      end record;
   for Nested_Rec use
      record
	 I at 0 * 4 range 0 .. 31;
	 R at 1 * 4 range 0 .. 63;
	 J at 3 * 4 range 0 .. 31;
	 end record;

   for Nested_Rec'Bit_Order use Opposite_Bit_Order;
   for Nested_Rec'Scalar_Storage_Order use Opposite_Bit_Order;

   Nr : Nested_Rec 
     := (I => 1,
	 R => (X => 1,
	       Y => 1),
	 J => 1);
   
   subtype Nested_Rec_As_Stream is Ada.Streams.Stream_Element_Array (1 ..16);

   function To_Stream is
     new Ada.Unchecked_Conversion (Nested_Rec, Nested_Rec_As_Stream);

   Nr_Stream : constant Nested_Rec_As_Stream := To_Stream (Nr);

   Expected : constant array (System.Bit_Order) of Nested_Rec_As_Stream :=
                (System.Low_Order_First =>
                   (0, 0, 0, 1,
                    1, 0, 0, 0,
                    1, 0, 0, 0,
                    0, 0, 0, 1),
                 System.High_Order_First =>
                   (1, 0, 0, 0,
                    0, 0, 0, 1,
                    0, 0, 0, 1,
                    1, 0, 0, 0));

begin
   if Nr_Stream /= Expected (System.Default_Bit_Order) then
      raise Program_Error;
   end if;
end;