diff options
Diffstat (limited to 'gcc/testsuite/gnat.dg/sso4.adb')
-rw-r--r-- | gcc/testsuite/gnat.dg/sso4.adb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/gcc/testsuite/gnat.dg/sso4.adb b/gcc/testsuite/gnat.dg/sso4.adb new file mode 100644 index 00000000000..6a409e92a5f --- /dev/null +++ b/gcc/testsuite/gnat.dg/sso4.adb @@ -0,0 +1,55 @@ +-- { dg-do run } + +with System; + +procedure SSO4 is + + type Short_Int is mod 2**16; + + type Rec1 is record + F1 : Short_Int; + F2 : Short_Int; + end record; + for Rec1 use record + F1 at 0 range 0 .. 15; + F2 at 0 range 16 .. 31; + end record; + + for Rec1'Bit_Order use System.High_Order_First; + for Rec1'Scalar_Storage_Order use System.High_Order_First; + + type Rec2 is record + I1 : Integer; + R1 : Rec1; + end record; + for Rec2 use record + I1 at 0 range 0 .. 31; + R1 at 4 range 0 .. 31; + end record; + for Rec2'Bit_Order use System.High_Order_First; + for Rec2'Scalar_Storage_Order use System.High_Order_First; + + type Rec3 is record + Data : Rec1; + end record; + for Rec3 use record + Data at 0 range 0 .. 31; + end record; + for Rec3'Bit_Order use System.High_Order_First; + for Rec3'Scalar_Storage_Order use System.High_Order_First; + + procedure Copy (Message : in Rec3) is + Local : Rec2; + begin + Local := (I1 => 1, R1 => Message.Data); + if Local.R1 /= Message.Data then + raise Program_Error; + end if; + end; + + Message : Rec3; + +begin + Message := (Data => (2, 3)); + Copy(Message); +end; |