OSDN Git Service

PR 33870
[pf3gnuchains/gcc-fork.git] / gcc / ada / switch-c.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                             S W I T C H - C                              --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 2001-2007, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Debug;    use Debug;
27 with Lib;      use Lib;
28 with Osint;    use Osint;
29 with Opt;      use Opt;
30 with Prepcomp; use Prepcomp;
31 with Validsw;  use Validsw;
32 with Sem_Warn; use Sem_Warn;
33 with Stylesw;  use Stylesw;
34
35 with System.OS_Lib; use System.OS_Lib;
36
37 with System.WCh_Con; use System.WCh_Con;
38
39 package body Switch.C is
40
41    RTS_Specified : String_Access := null;
42    --  Used to detect multiple use of --RTS= flag
43
44    -----------------------------
45    -- Scan_Front_End_Switches --
46    -----------------------------
47
48    procedure Scan_Front_End_Switches (Switch_Chars : String) is
49       First_Switch : Boolean := True;
50       --  False for all but first switch
51
52       Max : constant Natural := Switch_Chars'Last;
53       Ptr : Natural;
54       C   : Character := ' ';
55       Dot : Boolean;
56
57       Store_Switch : Boolean;
58       --  For -gnatxx switches, the normal processing, signalled by this flag
59       --  being set to True, is to store the switch on exit from the case
60       --  statement, the switch stored is -gnat followed by the characters
61       --  from First_Char to Ptr-1. For cases like -gnaty, where the switch
62       --  is stored in separate pieces, this flag is set to False, and the
63       --  appropriate calls to Store_Compilation_Switch are made from within
64       --  the case branch.
65
66       First_Char : Positive;
67       --  Marks start of switch to be stored
68
69    begin
70       Ptr := Switch_Chars'First;
71
72       --  Skip past the initial character (must be the switch character)
73
74       if Ptr = Max then
75          Bad_Switch (C);
76       else
77          Ptr := Ptr + 1;
78       end if;
79
80       --  Handle switches that do not start with -gnat
81
82       if Ptr + 3 > Max
83         or else Switch_Chars (Ptr .. Ptr + 3) /= "gnat"
84       then
85          --  There are two front-end switches that do not start with -gnat:
86          --  -I, --RTS
87
88          if Switch_Chars (Ptr) = 'I' then
89
90             --  Set flag Search_Directory_Present if switch is "-I" only:
91             --  the directory will be the next argument.
92
93             if Ptr = Max then
94                Search_Directory_Present := True;
95                return;
96             end if;
97
98             Ptr := Ptr + 1;
99
100             --  Find out whether this is a -I- or regular -Ixxx switch
101
102             --  Note: -I switches are not recorded in the ALI file, since the
103             --  meaning of the program depends on the source files compiled,
104             --  not where they came from.
105
106             if Ptr = Max and then Switch_Chars (Ptr) = '-' then
107                Look_In_Primary_Dir := False;
108             else
109                Add_Src_Search_Dir (Switch_Chars (Ptr .. Max));
110             end if;
111
112          --  Processing of the --RTS switch. --RTS may have been modified by
113          --  gcc into -fRTS (for GCC targets).
114
115          elsif Ptr + 3 <= Max
116            and then (Switch_Chars (Ptr .. Ptr + 3) = "fRTS"
117                        or else
118                      Switch_Chars (Ptr .. Ptr + 3) = "-RTS")
119          then
120             Ptr := Ptr + 1;
121
122             if Ptr + 4 > Max
123               or else Switch_Chars (Ptr + 3) /= '='
124             then
125                Osint.Fail ("missing path for --RTS");
126             else
127                --  Check that this is the first time --RTS is specified or if
128                --  it is not the first time, the same path has been specified.
129
130                if RTS_Specified = null then
131                   RTS_Specified := new String'(Switch_Chars (Ptr + 4 .. Max));
132
133                elsif
134                  RTS_Specified.all /= Switch_Chars (Ptr + 4 .. Max)
135                then
136                   Osint.Fail
137                     ("--RTS cannot be specified multiple times");
138                end if;
139
140                --  Valid --RTS switch
141
142                Opt.No_Stdinc := True;
143                Opt.RTS_Switch := True;
144
145                RTS_Src_Path_Name :=
146                  Get_RTS_Search_Dir
147                    (Switch_Chars (Ptr + 4 .. Max), Include);
148
149                RTS_Lib_Path_Name :=
150                  Get_RTS_Search_Dir
151                    (Switch_Chars (Ptr + 4 .. Max), Objects);
152
153                if RTS_Src_Path_Name /= null
154                  and then RTS_Lib_Path_Name /= null
155                then
156                   --  Store the -fRTS switch (Note: Store_Compilation_Switch
157                   --  changes -fRTS back into --RTS for the actual output).
158
159                   Store_Compilation_Switch (Switch_Chars);
160
161                elsif RTS_Src_Path_Name = null
162                  and then RTS_Lib_Path_Name = null
163                then
164                   Osint.Fail ("RTS path not valid: missing " &
165                               "adainclude and adalib directories");
166
167                elsif RTS_Src_Path_Name = null then
168                   Osint.Fail ("RTS path not valid: missing " &
169                               "adainclude directory");
170
171                elsif RTS_Lib_Path_Name = null then
172                   Osint.Fail ("RTS path not valid: missing " &
173                               "adalib directory");
174                end if;
175             end if;
176
177             --  There are no other switches not starting with -gnat
178
179          else
180             Bad_Switch (Switch_Chars);
181          end if;
182
183       --  Case of switch starting with -gnat
184
185       else
186          Ptr := Ptr + 4;
187
188          --  Loop to scan through switches given in switch string
189
190          while Ptr <= Max loop
191             First_Char := Ptr;
192             Store_Switch := True;
193
194             C := Switch_Chars (Ptr);
195
196             case C is
197
198             when 'a' =>
199                Ptr := Ptr + 1;
200                Assertions_Enabled := True;
201                Debug_Pragmas_Enabled := True;
202
203             --  Processing for A switch
204
205             when 'A' =>
206                Ptr := Ptr + 1;
207                Config_File := False;
208
209             --  Processing for b switch
210
211             when 'b' =>
212                Ptr := Ptr + 1;
213                Brief_Output := True;
214
215             --  Processing for c switch
216
217             when 'c' =>
218                if not First_Switch then
219                   Osint.Fail
220                     ("-gnatc must be first if combined with other switches");
221                end if;
222
223                Ptr := Ptr + 1;
224                Operating_Mode := Check_Semantics;
225
226                if Tree_Output then
227                   ASIS_Mode := True;
228                end if;
229
230             --  Processing for d switch
231
232             when 'd' =>
233                Store_Switch := False;
234                Dot := False;
235
236                --  Note: for the debug switch, the remaining characters in this
237                --  switch field must all be debug flags, since all valid switch
238                --  characters are also valid debug characters.
239
240                --  Loop to scan out debug flags
241
242                while Ptr < Max loop
243                   Ptr := Ptr + 1;
244                   C := Switch_Chars (Ptr);
245                   exit when C = ASCII.NUL or else C = '/' or else C = '-';
246
247                   if C in '1' .. '9' or else
248                      C in 'a' .. 'z' or else
249                      C in 'A' .. 'Z'
250                   then
251                      if Dot then
252                         Set_Dotted_Debug_Flag (C);
253                         Store_Compilation_Switch ("-gnatd." & C);
254                      else
255                         Set_Debug_Flag (C);
256                         Store_Compilation_Switch ("-gnatd" & C);
257                      end if;
258
259                   elsif C = '.' then
260                      Dot := True;
261
262                   elsif Dot then
263                      Bad_Switch ("-gnatd." & Switch_Chars (Ptr .. Max));
264                   else
265                      Bad_Switch ("-gnatd" & Switch_Chars (Ptr .. Max));
266                   end if;
267                end loop;
268
269                return;
270
271             --  Processing for D switch
272
273             when 'D' =>
274                Ptr := Ptr + 1;
275
276                --  Note: -gnatD also sets -gnatx (to turn off cross-reference
277                --  generation in the ali file) since otherwise this generation
278                --  gets confused by the "wrong" Sloc values put in the tree.
279
280                Debug_Generated_Code := True;
281                Xref_Active := False;
282                Set_Debug_Flag ('g');
283
284             --  -gnate? (extended switches)
285
286             when 'e' =>
287                Ptr := Ptr + 1;
288
289                --  The -gnate? switches are all double character switches
290                --  so we must always have a character after the e.
291
292                if Ptr > Max then
293                   Bad_Switch ("-gnate");
294                end if;
295
296                case Switch_Chars (Ptr) is
297
298                   --  -gnatec (configuration pragmas)
299
300                   when 'c' =>
301                      Store_Switch := False;
302                      Ptr := Ptr + 1;
303
304                      --  There may be an equal sign between -gnatec and
305                      --  the path name of the config file.
306
307                      if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
308                         Ptr := Ptr + 1;
309                      end if;
310
311                      if Ptr > Max then
312                         Bad_Switch ("-gnatec");
313                      end if;
314
315                      declare
316                         Config_File_Name : constant String_Access :=
317                                              new String'
318                                                   (Switch_Chars (Ptr .. Max));
319
320                      begin
321                         if Config_File_Names = null then
322                            Config_File_Names :=
323                              new String_List'(1 => Config_File_Name);
324
325                         else
326                            declare
327                               New_Names : constant String_List_Access :=
328                                             new String_List
329                                               (1 ..
330                                                Config_File_Names'Length + 1);
331
332                            begin
333                               for Index in Config_File_Names'Range loop
334                                  New_Names (Index) :=
335                                    Config_File_Names (Index);
336                                  Config_File_Names (Index) := null;
337                               end loop;
338
339                               New_Names (New_Names'Last) := Config_File_Name;
340                               Free (Config_File_Names);
341                               Config_File_Names := New_Names;
342                            end;
343                         end if;
344                      end;
345
346                      return;
347
348                   --  -gnateD switch (preprocessing symbol definition)
349
350                   when 'D' =>
351                      Store_Switch := False;
352                      Ptr := Ptr + 1;
353
354                      if Ptr > Max then
355                         Bad_Switch ("-gnateD");
356                      end if;
357
358                      Add_Symbol_Definition (Switch_Chars (Ptr .. Max));
359
360                      --  Store the switch
361
362                      Store_Compilation_Switch
363                        ("-gnateD" & Switch_Chars (Ptr .. Max));
364                      Ptr := Max + 1;
365
366                   --  -gnatef (full source path for brief error messages)
367
368                   when 'f' =>
369                      Store_Switch := False;
370                      Ptr := Ptr + 1;
371                      Full_Path_Name_For_Brief_Errors := True;
372                      return;
373
374                   --  -gnateI (index of unit in multi-unit source)
375
376                   when 'I' =>
377                      Ptr := Ptr + 1;
378                      Scan_Pos (Switch_Chars, Max, Ptr, Multiple_Unit_Index, C);
379
380                   --  -gnatem (mapping file)
381
382                   when 'm' =>
383                      Store_Switch := False;
384                      Ptr := Ptr + 1;
385
386                      --  There may be an equal sign between -gnatem and
387                      --  the path name of the mapping file.
388
389                      if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
390                         Ptr := Ptr + 1;
391                      end if;
392
393                      if Ptr > Max then
394                         Bad_Switch ("-gnatem");
395                      end if;
396
397                      Mapping_File_Name :=
398                        new String'(Switch_Chars (Ptr .. Max));
399                      return;
400
401                   --  -gnatep (preprocessing data file)
402
403                   when 'p' =>
404                      Store_Switch := False;
405                      Ptr := Ptr + 1;
406
407                      --  There may be an equal sign between -gnatep and
408                      --  the path name of the mapping file.
409
410                      if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
411                         Ptr := Ptr + 1;
412                      end if;
413
414                      if Ptr > Max then
415                         Bad_Switch ("-gnatep");
416                      end if;
417
418                      Preprocessing_Data_File :=
419                        new String'(Switch_Chars (Ptr .. Max));
420
421                      --  Store the switch, normalizing to -gnatep=
422
423                      Store_Compilation_Switch
424                        ("-gnatep=" & Preprocessing_Data_File.all);
425
426                      Ptr := Max + 1;
427
428                   when 'z' =>
429                      Store_Switch := False;
430                      Disable_Switch_Storing;
431                      Ptr := Ptr + 1;
432
433                   --  All other -gnate? switches are unassigned
434
435                   when others =>
436                      Bad_Switch ("-gnate" & Switch_Chars (Ptr .. Max));
437                end case;
438
439             --  -gnatE (dynamic elaboration checks)
440
441             when 'E' =>
442                Ptr := Ptr + 1;
443                Dynamic_Elaboration_Checks := True;
444
445             --  -gnatf (full error messages)
446
447             when 'f' =>
448                Ptr := Ptr + 1;
449                All_Errors_Mode := True;
450
451             --  Processing for F switch
452
453             when 'F' =>
454                Ptr := Ptr + 1;
455                External_Name_Exp_Casing := Uppercase;
456                External_Name_Imp_Casing := Uppercase;
457
458             --  Processing for g switch
459
460             when 'g' =>
461                Ptr := Ptr + 1;
462                GNAT_Mode := True;
463                Identifier_Character_Set := 'n';
464                System_Extend_Unit := Empty;
465                Warning_Mode := Treat_As_Error;
466
467                --  Set Ada 2005 mode explicitly. We don't want to rely on the
468                --  implicit setting here, since for example, we want
469                --  Preelaborate_05 treated as Preelaborate
470
471                Ada_Version := Ada_05;
472                Ada_Version_Explicit := Ada_Version;
473
474                --  Set default warnings for -gnatg
475
476                Check_Unreferenced              := True;
477                Check_Unreferenced_Formals      := True;
478                Check_Withs                     := True;
479                Constant_Condition_Warnings     := True;
480                Implementation_Unit_Warnings    := True;
481                Ineffective_Inline_Warnings     := True;
482                Warn_On_Assumed_Low_Bound       := True;
483                Warn_On_Bad_Fixed_Value         := True;
484                Warn_On_Constant                := True;
485                Warn_On_Export_Import           := True;
486                Warn_On_Modified_Unread         := True;
487                Warn_On_No_Value_Assigned       := True;
488                Warn_On_Non_Local_Exception     := False;
489                Warn_On_Obsolescent_Feature     := True;
490                Warn_On_Redundant_Constructs    := True;
491                Warn_On_Object_Renames_Function := True;
492                Warn_On_Unchecked_Conversion    := True;
493                Warn_On_Unrecognized_Pragma     := True;
494
495                Set_GNAT_Style_Check_Options;
496
497             --  Processing for G switch
498
499             when 'G' =>
500                Ptr := Ptr + 1;
501                Print_Generated_Code := True;
502
503             --  Processing for h switch
504
505             when 'h' =>
506                Ptr := Ptr + 1;
507                Usage_Requested := True;
508
509             --  Processing for H switch
510
511             when 'H' =>
512                Ptr := Ptr + 1;
513                HLO_Active := True;
514
515             --  Processing for i switch
516
517             when 'i' =>
518                if Ptr = Max then
519                   Bad_Switch ("-gnati");
520                end if;
521
522                Ptr := Ptr + 1;
523                C := Switch_Chars (Ptr);
524
525                if C in '1' .. '5'
526                  or else C = '8'
527                  or else C = '9'
528                  or else C = 'p'
529                  or else C = 'f'
530                  or else C = 'n'
531                  or else C = 'w'
532                then
533                   Identifier_Character_Set := C;
534                   Ptr := Ptr + 1;
535
536                else
537                   Bad_Switch ("-gnati" & Switch_Chars (Ptr .. Max));
538                end if;
539
540             --  Processing for I switch
541
542             when 'I' =>
543                Ptr := Ptr + 1;
544                Ignore_Rep_Clauses := True;
545
546             --  Processing for j switch
547
548             when 'j' =>
549                Ptr := Ptr + 1;
550
551                --  There may be an equal sign between -gnatj and the value
552
553                if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
554                   Ptr := Ptr + 1;
555                end if;
556
557                Scan_Nat (Switch_Chars, Max, Ptr, Error_Msg_Line_Length, C);
558
559             --  Processing for k switch
560
561             when 'k' =>
562                Ptr := Ptr + 1;
563                   Scan_Pos
564                     (Switch_Chars, Max, Ptr, Maximum_File_Name_Length, C);
565
566             --  Processing for l switch
567
568             when 'l' =>
569                Ptr := Ptr + 1;
570                Full_List := True;
571
572                --  There may be an equal sign between -gnatl and a file name
573
574                if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
575                   if Ptr = Max then
576                      Osint.Fail ("file name for -gnatl= is null");
577                   else
578                      Opt.Full_List_File_Name :=
579                        new String'(Switch_Chars (Ptr + 1 .. Max));
580                      Ptr := Max + 1;
581                   end if;
582                end if;
583
584             --  Processing for L switch
585
586             when 'L' =>
587                Ptr := Ptr + 1;
588                Dump_Source_Text := True;
589
590             --  Processing for m switch
591
592             when 'm' =>
593                Ptr := Ptr + 1;
594
595                --  There may be an equal sign between -gnatm and the value
596
597                if Ptr <= Max and then Switch_Chars (Ptr) = '=' then
598                   Ptr := Ptr + 1;
599                end if;
600
601                Scan_Nat (Switch_Chars, Max, Ptr, Maximum_Errors, C);
602
603             --  Processing for n switch
604
605             when 'n' =>
606                Ptr := Ptr + 1;
607                Inline_Active := True;
608
609             --  Processing for N switch
610
611             when 'N' =>
612                Ptr := Ptr + 1;
613                Inline_Active := True;
614                Front_End_Inlining := True;
615
616             --  Processing for o switch
617
618             when 'o' =>
619                Ptr := Ptr + 1;
620                Suppress_Options (Overflow_Check) := False;
621                Opt.Enable_Overflow_Checks := True;
622
623             --  Processing for O switch
624
625             when 'O' =>
626                Store_Switch := False;
627                Ptr := Ptr + 1;
628                Output_File_Name_Present := True;
629
630             --  Processing for p switch
631
632             when 'p' =>
633                Ptr := Ptr + 1;
634
635                --  Set all specific options as well as All_Checks in the
636                --  Suppress_Options array, excluding Elaboration_Check, since
637                --  this is treated specially because we do not want -gnatp to
638                --  disable static elaboration processing.
639
640                for J in Suppress_Options'Range loop
641                   if J /= Elaboration_Check then
642                      Suppress_Options (J) := True;
643                   end if;
644                end loop;
645
646                Validity_Checks_On         := False;
647                Opt.Suppress_Checks        := True;
648                Opt.Enable_Overflow_Checks := False;
649
650             --  Processing for P switch
651
652             when 'P' =>
653                Ptr := Ptr + 1;
654                Polling_Required := True;
655
656             --  Processing for q switch
657
658             when 'q' =>
659                Ptr := Ptr + 1;
660                Try_Semantics := True;
661
662             --  Processing for q switch
663
664             when 'Q' =>
665                Ptr := Ptr + 1;
666                Force_ALI_Tree_File := True;
667                Try_Semantics := True;
668
669             --  Processing for R switch
670
671             when 'R' =>
672                Back_Annotate_Rep_Info := True;
673                List_Representation_Info := 1;
674
675                Ptr := Ptr + 1;
676                while Ptr <= Max loop
677                   C := Switch_Chars (Ptr);
678
679                   if C in '1' .. '3' then
680                      List_Representation_Info :=
681                        Character'Pos (C) - Character'Pos ('0');
682
683                   elsif Switch_Chars (Ptr) = 's' then
684                      List_Representation_Info_To_File := True;
685
686                   elsif Switch_Chars (Ptr) = 'm' then
687                      List_Representation_Info_Mechanisms := True;
688
689                   else
690                      Bad_Switch ("-gnatR" & Switch_Chars (Ptr .. Max));
691                   end if;
692
693                   Ptr := Ptr + 1;
694                end loop;
695
696             --  Processing for s switch
697
698             when 's' =>
699                if not First_Switch then
700                   Osint.Fail
701                     ("-gnats must be first if combined with other switches");
702                end if;
703
704                Ptr := Ptr + 1;
705                Operating_Mode := Check_Syntax;
706
707             --  Processing for S switch
708
709             when 'S' =>
710                Print_Standard := True;
711                Ptr := Ptr + 1;
712
713             --  Processing for t switch
714
715             when 't' =>
716                Ptr := Ptr + 1;
717                Tree_Output := True;
718
719                if Operating_Mode = Check_Semantics then
720                   ASIS_Mode := True;
721                end if;
722
723                Back_Annotate_Rep_Info := True;
724
725             --  Processing for T switch
726
727             when 'T' =>
728                Ptr := Ptr + 1;
729                Scan_Pos (Switch_Chars, Max, Ptr, Table_Factor, C);
730
731             --  Processing for u switch
732
733             when 'u' =>
734                Ptr := Ptr + 1;
735                List_Units := True;
736
737             --  Processing for U switch
738
739             when 'U' =>
740                Ptr := Ptr + 1;
741                Unique_Error_Tag := True;
742
743             --  Processing for v switch
744
745             when 'v' =>
746                Ptr := Ptr + 1;
747                Verbose_Mode := True;
748
749             --  Processing for V switch
750
751             when 'V' =>
752                Store_Switch := False;
753                Ptr := Ptr + 1;
754
755                if Ptr > Max then
756                   Bad_Switch ("-gnatV");
757
758                else
759                   declare
760                      OK  : Boolean;
761
762                   begin
763                      Set_Validity_Check_Options
764                        (Switch_Chars (Ptr .. Max), OK, Ptr);
765
766                      if not OK then
767                         Bad_Switch ("-gnatV" & Switch_Chars (Ptr .. Max));
768                      end if;
769
770                      for Index in First_Char + 1 .. Max loop
771                         Store_Compilation_Switch
772                           ("-gnatV" & Switch_Chars (Index));
773                      end loop;
774                   end;
775                end if;
776
777                Ptr := Max + 1;
778
779             --  Processing for w switch
780
781             when 'w' =>
782                Store_Switch := False;
783                Ptr := Ptr + 1;
784
785                if Ptr > Max then
786                   Bad_Switch ("-gnatw");
787                end if;
788
789                while Ptr <= Max loop
790                   C := Switch_Chars (Ptr);
791
792                   --  Case of dot switch
793
794                   if C = '.' and then Ptr < Max then
795                      Ptr := Ptr + 1;
796                      C := Switch_Chars (Ptr);
797
798                      if Set_Dot_Warning_Switch (C) then
799                         Store_Compilation_Switch ("-gnatw." & C);
800                      else
801                         Bad_Switch ("-gnatw." & Switch_Chars (Ptr .. Max));
802                      end if;
803
804                      --  Normal case, no dot
805
806                   else
807                      if Set_Warning_Switch (C) then
808                         Store_Compilation_Switch ("-gnatw" & C);
809                      else
810                         Bad_Switch ("-gnatw" & Switch_Chars (Ptr .. Max));
811                      end if;
812                   end if;
813
814                   Ptr := Ptr + 1;
815                end loop;
816
817                return;
818
819             --  Processing for W switch
820
821             when 'W' =>
822                Ptr := Ptr + 1;
823
824                if Ptr > Max then
825                   Bad_Switch ("-gnatW");
826                end if;
827
828                begin
829                   Wide_Character_Encoding_Method :=
830                     Get_WC_Encoding_Method (Switch_Chars (Ptr));
831                exception
832                   when Constraint_Error =>
833                      Bad_Switch ("-gnatW" & Switch_Chars (Ptr .. Max));
834                end;
835
836                Upper_Half_Encoding :=
837                  Wide_Character_Encoding_Method in
838                  WC_Upper_Half_Encoding_Method;
839
840                Ptr := Ptr + 1;
841
842             --  Processing for x switch
843
844             when 'x' =>
845                Ptr := Ptr + 1;
846                Xref_Active := False;
847
848             --  Processing for X switch
849
850             when 'X' =>
851                Ptr := Ptr + 1;
852                Extensions_Allowed := True;
853
854             --  Processing for y switch
855
856             when 'y' =>
857                Ptr := Ptr + 1;
858
859                if Ptr > Max then
860                   Set_Default_Style_Check_Options;
861
862                else
863                   Store_Switch := False;
864
865                   declare
866                      OK  : Boolean;
867
868                   begin
869                      Set_Style_Check_Options
870                        (Switch_Chars (Ptr .. Max), OK, Ptr);
871
872                      if not OK then
873                         Osint.Fail
874                           ("bad -gnaty switch (" &
875                            Style_Msg_Buf (1 .. Style_Msg_Len) & ')');
876                      end if;
877
878                      Ptr := First_Char + 1;
879                      while Ptr <= Max loop
880                         if Switch_Chars (Ptr) = 'M' then
881                            First_Char := Ptr;
882                            loop
883                               Ptr := Ptr + 1;
884                               exit when Ptr > Max
885                                 or else Switch_Chars (Ptr) not in '0' .. '9';
886                            end loop;
887
888                            Store_Compilation_Switch
889                              ("-gnaty" & Switch_Chars (First_Char .. Ptr - 1));
890
891                         else
892                            Store_Compilation_Switch
893                              ("-gnaty" & Switch_Chars (Ptr));
894                            Ptr := Ptr + 1;
895                         end if;
896                      end loop;
897                   end;
898                end if;
899
900             --  Processing for z switch
901
902             when 'z' =>
903                Ptr := Ptr + 1;
904
905                --  Allowed for compiler only if this is the only
906                --  -z switch, we do not allow multiple occurrences
907
908                if Distribution_Stub_Mode = No_Stubs then
909                   case Switch_Chars (Ptr) is
910                      when 'r' =>
911                         Distribution_Stub_Mode := Generate_Receiver_Stub_Body;
912
913                      when 'c' =>
914                         Distribution_Stub_Mode := Generate_Caller_Stub_Body;
915
916                      when others =>
917                         Bad_Switch ("-gnatz" & Switch_Chars (Ptr .. Max));
918                   end case;
919
920                   Ptr := Ptr + 1;
921                end if;
922
923             --  Processing for Z switch
924
925             when 'Z' =>
926                Ptr := Ptr + 1;
927                Osint.Fail
928                  ("-gnatZ is no longer supported: consider using --RTS=zcx");
929
930             --  Processing for 83 switch
931
932             when '8' =>
933                if Ptr = Max then
934                   Bad_Switch ("-gnat8");
935                end if;
936
937                Ptr := Ptr + 1;
938
939                if Switch_Chars (Ptr) /= '3' then
940                   Bad_Switch ("-gnat8" & Switch_Chars (Ptr .. Max));
941                else
942                   Ptr := Ptr + 1;
943                   Ada_Version := Ada_83;
944                   Ada_Version_Explicit := Ada_Version;
945                end if;
946
947             --  Processing for 95 switch
948
949             when '9' =>
950                if Ptr = Max then
951                   Bad_Switch ("-gnat9");
952                end if;
953
954                Ptr := Ptr + 1;
955
956                if Switch_Chars (Ptr) /= '5' then
957                   Bad_Switch ("-gnat9" & Switch_Chars (Ptr .. Max));
958                else
959                   Ptr := Ptr + 1;
960                   Ada_Version := Ada_95;
961                   Ada_Version_Explicit := Ada_Version;
962                end if;
963
964             --  Processing for 05 switch
965
966             when '0' =>
967                if Ptr = Max then
968                   Bad_Switch ("-gnat0");
969                end if;
970
971                Ptr := Ptr + 1;
972
973                if Switch_Chars (Ptr) /= '5' then
974                   Bad_Switch ("-gnat0" & Switch_Chars (Ptr .. Max));
975                else
976                   Ptr := Ptr + 1;
977                   Ada_Version := Ada_05;
978                   Ada_Version_Explicit := Ada_Version;
979                end if;
980
981             --  Ignore extra switch character
982
983             when '/' | '-' =>
984                Ptr := Ptr + 1;
985
986             --  Anything else is an error (illegal switch character)
987
988             when others =>
989                Bad_Switch ("-gnat" & Switch_Chars (Ptr .. Max));
990             end case;
991
992             if Store_Switch then
993                Store_Compilation_Switch
994                  ("-gnat" & Switch_Chars (First_Char .. Ptr - 1));
995             end if;
996
997             First_Switch := False;
998          end loop;
999       end if;
1000    end Scan_Front_End_Switches;
1001
1002 end Switch.C;