-- { dg-do compile } -- { dg-options "-O3" } with Ada.Unchecked_Deallocation; package body Opt68 is procedure Free is new Ada.Unchecked_Deallocation (Queue_Element, A_Queue_Element); procedure Copy (dest : in out Queue; src : Queue) is d, s, pd, ps, t : A_Queue_Element; begin if src.sz /= 0 then d := dest.front; s := src.front; while d /= null and s /= null loop d.value := s.value; pd := d; ps := s; d := d.next; s := s.next; end loop; if src.sz = dest.sz then return; elsif s = null then while d /= null loop t := d.next; Free (d); d := t; end loop; dest.back := pd; dest.back.next := null; else if pd = null then dest.front := new Queue_Element; dest.front.value := s.value; s := s.next; pd := dest.front; end if; while s /= null loop pd.next := new Queue_Element; pd.next.value := s.value; pd := pd.next; s := s.next; end loop; dest.back := pd; end if; dest.sz := src.sz; end if; end; end Opt68;