*** ./testsuite/gnat.dg/scalar_mode_agg_compare_loop.adb.ori 2006-06-22 18:08:12.000000000 +0200 --- ./testsuite/gnat.dg/scalar_mode_agg_compare_loop.adb 2006-06-23 10:27:49.000000000 +0200 *************** *** 0 **** --- 1,18 ---- + + -- { dg-do compile } + -- { dg-options "-O2 -gnatp" } + + function Scalar_Mode_Agg_Compare_Loop return Boolean is + S : constant String (1 .. 4) := "ABCD"; + F : constant Natural := S'First; + L : constant Natural := S'Last; + begin + for J in F .. L - 1 loop + if S (F .. F) = "X" or (J <= L - 2 and S (J .. J + 1) = "YY") then + return True; + end if; + end loop; + + return False; + end; + *** ./testsuite/gnat.dg/scalar_mode_agg_compare.adb.ori 2006-06-22 17:09:27.000000000 +0200 --- ./testsuite/gnat.dg/scalar_mode_agg_compare.adb 2006-06-22 17:09:27.000000000 +0200 *************** *** 0 **** --- 1,25 ---- + -- { dg-do run } + + procedure Scalar_Mode_Agg_Compare is + + type Point is record + Mapped : Boolean; + Tag : String (1 .. 2); -- HImode + end record; + pragma Pack (Point); -- Tag possibly at bitpos 1 + + function My_Point return Point is + begin + return (Mapped => True, Tag => "XX"); + end; + + A, B : Point := My_Point; + begin + -- The comparison below should find the two Tag fields equal and not + -- attempt to take their address, which might not be byte aligned. + + if A.Tag /= B.Tag then + raise Program_Error; + end if; + end; +