-- { dg-do compile } -- { dg-options "-O -fdump-tree-optimized" } procedure Loop_Optimization19 is type Array_T is array (Positive range <>) of Integer; type Obj_T (Length : Natural) is record Elements : Array_T (1 .. Length); end record; type T is access Obj_T; function Equal (S1, S2 : T) return Boolean; pragma No_Inline (Equal); function Equal (S1, S2 : T) return Boolean is begin if S1.Length = S2.Length then for I in 1 .. S1.Length loop if S1.Elements (I) /= S2.Elements (I) then return False; end if; end loop; return True; else return False; end if; end Equal; A : T := new Obj_T (Length => 10); B : T := new Obj_T (Length => 20); C : T := new Obj_T (Length => 30); begin if Equal (A, B) then raise Program_Error; else if Equal (B, C) then raise Program_Error; end if; end if; end; -- { dg-final { scan-tree-dump-not "Index_Check" "optimized" } }