--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-gnatws -O3" }
+-- { dg-options "-gnatws -O3 -msse" { target i?86-*-* x86_64-*-* } }
+
+with System.Soft_Links;
+
+package body Loop_Optimization9 is
+
+ package SSL renames System.Soft_Links;
+
+ First_Temp_File_Name : constant String := "GNAT-TEMP-000000.TMP";
+
+ Current_Temp_File_Name : String := First_Temp_File_Name;
+
+ Temp_File_Name_Last_Digit : constant Positive :=
+ First_Temp_File_Name'Last - 4;
+
+ function Argument_String_To_List
+ (Arg_String : String) return Argument_List_Access
+ is
+ Max_Args : constant Integer := Arg_String'Length;
+ New_Argv : Argument_List (1 .. Max_Args);
+ New_Argc : Natural := 0;
+ Idx : Integer;
+
+ begin
+ Idx := Arg_String'First;
+
+ loop
+ exit when Idx > Arg_String'Last;
+
+ declare
+ Quoted : Boolean := False;
+ Backqd : Boolean := False;
+ Old_Idx : Integer;
+
+ begin
+ Old_Idx := Idx;
+
+ loop
+ -- An unquoted space is the end of an argument
+
+ if not (Backqd or Quoted)
+ and then Arg_String (Idx) = ' '
+ then
+ exit;
+
+ -- Start of a quoted string
+
+ elsif not (Backqd or Quoted)
+ and then Arg_String (Idx) = '"'
+ then
+ Quoted := True;
+
+ -- End of a quoted string and end of an argument
+
+ elsif (Quoted and not Backqd)
+ and then Arg_String (Idx) = '"'
+ then
+ Idx := Idx + 1;
+ exit;
+
+ -- Following character is backquoted
+
+ elsif Arg_String (Idx) = '\' then
+ Backqd := True;
+
+ -- Turn off backquoting after advancing one character
+
+ elsif Backqd then
+ Backqd := False;
+
+ end if;
+
+ Idx := Idx + 1;
+ exit when Idx > Arg_String'Last;
+ end loop;
+
+ -- Found an argument
+
+ New_Argc := New_Argc + 1;
+ New_Argv (New_Argc) :=
+ new String'(Arg_String (Old_Idx .. Idx - 1));
+ end;
+ end loop;
+
+ return new Argument_List'(New_Argv (1 .. New_Argc));
+ end Argument_String_To_List;
+
+ procedure Create_Temp_File_Internal
+ (FD : out File_Descriptor;
+ Name : out String_Access)
+ is
+ Pos : Positive;
+ begin
+ File_Loop : loop
+ Locked : begin
+ Pos := Temp_File_Name_Last_Digit;
+
+ Digit_Loop :
+ loop
+ case Current_Temp_File_Name (Pos) is
+ when '0' .. '8' =>
+ Current_Temp_File_Name (Pos) :=
+ Character'Succ (Current_Temp_File_Name (Pos));
+ exit Digit_Loop;
+
+ when '9' =>
+ Current_Temp_File_Name (Pos) := '0';
+ Pos := Pos - 1;
+
+ when others =>
+
+ SSL.Unlock_Task.all;
+ FD := 0;
+ Name := null;
+ exit File_Loop;
+ end case;
+ end loop Digit_Loop;
+ end Locked;
+ end loop File_Loop;
+ end Create_Temp_File_Internal;
+
+end Loop_Optimization9;
--- /dev/null
+with GNAT.Strings; use GNAT.Strings;
+
+package Loop_Optimization9 is
+
+ type File_Descriptor is new Integer;
+
+ procedure Create_Temp_File_Internal
+ (FD : out File_Descriptor;
+ Name : out String_Access);
+
+ subtype Argument_List is String_List;
+
+ subtype Argument_List_Access is String_List_Access;
+
+ function Argument_String_To_List
+ (Arg_String : String) return Argument_List_Access;
+
+end Loop_Optimization9;