[Ada] Ada2020: Update Impunit for Ada 202X
authorBob Duff <duff@adacore.com>
Fri, 13 Dec 2019 09:03:50 +0000 (09:03 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 13 Dec 2019 09:03:50 +0000 (09:03 +0000)
2019-12-13  Bob Duff  <duff@adacore.com>

gcc/ada/

* impunit.ads: Add Ada_202X_Unit.
* impunit.adb: Add a table Non_Imp_File_Names_2X analogous to
the other tables. Add code to search this table.
* opt.ads: Add Warn_On_Ada_202X_Compatibility flag, currently
always True.
* sem_ch10.adb (Analyze_With_Clause): Give a warning if an Ada
2020 unit is with-ed when Ada_Version < Ada_2020.  Change 'if'
to 'case': Full coverage rules rule.

From-SVN: r279346

gcc/ada/ChangeLog
gcc/ada/impunit.adb
gcc/ada/impunit.ads
gcc/ada/opt.ads
gcc/ada/sem_ch10.adb

index 5f2b5026f00ac42956b1103823be2daad79626b4..209a2d452ec7e0717c5bed150655b8cfd3d141fa 100644 (file)
@@ -1,3 +1,14 @@
+2019-12-13  Bob Duff  <duff@adacore.com>
+
+       * impunit.ads: Add Ada_202X_Unit.
+       * impunit.adb: Add a table Non_Imp_File_Names_2X analogous to
+       the other tables. Add code to search this table.
+       * opt.ads: Add Warn_On_Ada_202X_Compatibility flag, currently
+       always True.
+       * sem_ch10.adb (Analyze_With_Clause): Give a warning if an Ada
+       2020 unit is with-ed when Ada_Version < Ada_2020.  Change 'if'
+       to 'case': Full coverage rules rule.
+
 2019-12-13  Bob Duff  <duff@adacore.com>
 
        * rtsfind.ads: Minor comment fix.
index 11d3a9056e545aef1120ce60ffe434dd0997986e..6bff383c4411a7d290bff91b2cd70934813e0d44 100644 (file)
@@ -613,6 +613,19 @@ package body Impunit is
     ("a-cvgpso", F)   -- Ada.Containers.Vectors.Generic_Parallel_Sorting from
    );                 -- GNATCOLL.OMP
 
+   --------------------
+   -- Ada 202X Units --
+   --------------------
+
+   --  The following units should be used only in Ada 202X mode
+
+   Non_Imp_File_Names_2X : constant File_List := (
+    0 => ("a-stteou", T)  -- Ada.Strings.Text_Output
+    --  ???We use named notation, because there is only one of these so far.
+    --  When we add more, we should switch to positional notation, and erase
+    --  the "0 =>".
+   );
+
    -----------------------
    -- Alternative Units --
    -----------------------
@@ -733,6 +746,14 @@ package body Impunit is
          end if;
       end loop;
 
+      --  See if name is in 202X list
+
+      for J in Non_Imp_File_Names_2X'Range loop
+         if Buffer = Non_Imp_File_Names_2X (J).Fname then
+            return Ada_202X_Unit;
+         end if;
+      end loop;
+
       --  Only remaining special possibilities are children of System.RPC and
       --  System.Garlic and special files of the form System.Aux...
 
index 466cb86fbad75ca562cadcc170e17946cc253246..7e6ea61916bf72ed52e00cc94616fd9a22b192f5 100644 (file)
@@ -45,19 +45,13 @@ package Impunit is
       --  This is not a predefined unit, so no checks are needed
 
       Ada_95_Unit,
-      --  This unit is defined in the Ada 95 RM, and can be freely with'ed in
-      --  both Ada 95 mode and Ada 05 mode. Note that in Ada 83 mode, no child
-      --  units are allowed, so you can't even name such a unit.
-
       Ada_2005_Unit,
-      --  This unit is defined in the Ada 2005 RM. Withing this unit from an
-      --  Ada 95 mode program will generate a warning (again, strictly speaking
-      --  this should be an error, but that seems over-strenuous).
-
-      Ada_2012_Unit);
-      --  This unit is defined in the Ada 2012 RM. Withing this unit from an
-      --  Ada 95 or 2005 mode program will generate a warning (again, strictly
-      --  speaking this should be an error, but that seems over-strenuous).
+      Ada_2012_Unit,
+      Ada_202X_Unit);
+      --  This unit is defined in the Ada RM of the given year. This is used to
+      --  give a warning when withing a unit from a wrong mode (e.g. withing an
+      --  Ada_2012_Unit when compiling with -gnat95). Note that in Ada 83 mode,
+      --  no child units are allowed, so you can't even name such a unit.
 
    function Get_Kind_Of_Unit (U : Unit_Number_Type) return Kind_Of_Unit;
    --  Given the unit number of a unit, this function determines the type
index 94534642a2d9d0f262392ed2b24160da39935645..fcfafc4d747292bf7c4b4d723bf2da627c7f2e5a 100644 (file)
@@ -1767,6 +1767,12 @@ package Opt is
    --  including warnings on Ada 2012 obsolescent features used in Ada 2012
    --  mode. Modified by use of -gnatwy/Y.
 
+   Warn_On_Ada_202X_Compatibility : Boolean := True;
+   --  GNAT
+   --  Set to True to generate all warnings on Ada 202X compatibility issues,
+   --  including warnings on Ada 202X obsolescent features used in Ada 202X
+   --  mode. ???There is no warning switch for this yet.
+
    Warn_On_All_Unread_Out_Parameters : Boolean := False;
    --  GNAT
    --  Set to True to generate warnings in all cases where a variable is
index 37518df84d6100a9b14cbb150dd51df07adf7acc..ae8bca7e239b2d809e3bca1b12197c0d43e00694 100644 (file)
@@ -2666,12 +2666,8 @@ package body Sem_Ch10 is
            and then not Implicit_With (N)
            and then not Restriction_Violation
          then
-            declare
-               U_Kind : constant Kind_Of_Unit :=
-                          Get_Kind_Of_Unit (Get_Source_Unit (U));
-
-            begin
-               if U_Kind = Implementation_Unit then
+            case Get_Kind_Of_Unit (Get_Source_Unit (U)) is
+               when Implementation_Unit =>
                   Error_Msg_F ("& is an internal 'G'N'A'T unit?i?", Name (N));
 
                   --  Add alternative name if available, otherwise issue a
@@ -2685,19 +2681,30 @@ package body Sem_Ch10 is
                         & "version-dependent?i?", Name (N));
                   end if;
 
-               elsif U_Kind = Ada_2005_Unit
-                 and then Ada_Version < Ada_2005
-                 and then Warn_On_Ada_2005_Compatibility
-               then
-                  Error_Msg_N ("& is an Ada 2005 unit?i?", Name (N));
+               when Not_Predefined_Unit | Ada_95_Unit =>
+                  null; -- no checks needed
 
-               elsif U_Kind = Ada_2012_Unit
-                 and then Ada_Version < Ada_2012
-                 and then Warn_On_Ada_2012_Compatibility
-               then
-                  Error_Msg_N ("& is an Ada 2012 unit?i?", Name (N));
-               end if;
-            end;
+               when Ada_2005_Unit =>
+                  if Ada_Version < Ada_2005
+                    and then Warn_On_Ada_2005_Compatibility
+                  then
+                     Error_Msg_N ("& is an Ada 2005 unit?i?", Name (N));
+                  end if;
+
+               when Ada_2012_Unit =>
+                  if Ada_Version < Ada_2012
+                    and then Warn_On_Ada_2012_Compatibility
+                  then
+                     Error_Msg_N ("& is an Ada 2012 unit?i?", Name (N));
+                  end if;
+
+               when Ada_202X_Unit =>
+                  if Ada_Version < Ada_2020
+                    and then Warn_On_Ada_202X_Compatibility
+                  then
+                     Error_Msg_N ("& is an Ada 202X unit?i?", Name (N));
+                  end if;
+            end case;
          end if;
       end if;