OSDN Git Service

2011-08-02 Yannick Moy <moy@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Aug 2011 09:21:47 +0000 (09:21 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Aug 2011 09:21:47 +0000 (09:21 +0000)
* sem_aggr.adb (Check_Qualified_Aggregate): new procedure which checks
qualification of aggregates in formal mode
(Is_Top_Level_Aggregate): returns True for an aggregate not contained in
another aggregate
(Resolve_Aggregate): complete the test that an aggregate is adequately
qualified in formal mode

2011-08-02  Pascal Obry  <obry@adacore.com>

* make.adb, bindgen.adb, gnatbind.adb: Minor reformatting.
* mlib-prj.adb: Supress warning when compiling binder generated file.
(Build_Library): Supress all warnings when compiling the binder
generated file.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177103 138bc75d-0d04-0410-961f-82ee72b054a4

13 files changed:
gcc/ada/ChangeLog
gcc/ada/Makefile.rtl
gcc/ada/a-cfdlli.adb
gcc/ada/a-cfhama.adb
gcc/ada/a-cfhase.adb
gcc/ada/a-cforma.adb
gcc/ada/a-cforse.adb
gcc/ada/a-cofove.adb
gcc/ada/bindgen.adb
gcc/ada/gnatbind.adb
gcc/ada/make.adb
gcc/ada/mlib-prj.adb
gcc/ada/sem_aggr.adb

index b50d02a..2eae3c8 100644 (file)
@@ -1,5 +1,21 @@
 2011-08-02  Yannick Moy  <moy@adacore.com>
 
+       * sem_aggr.adb (Check_Qualified_Aggregate): new procedure which checks
+       qualification of aggregates in formal mode
+       (Is_Top_Level_Aggregate): returns True for an aggregate not contained in
+       another aggregate
+       (Resolve_Aggregate): complete the test that an aggregate is adequately
+       qualified in formal mode
+
+2011-08-02  Pascal Obry  <obry@adacore.com>
+
+       * make.adb, bindgen.adb, gnatbind.adb: Minor reformatting.
+       * mlib-prj.adb: Supress warning when compiling binder generated file.
+       (Build_Library): Supress all warnings when compiling the binder
+       generated file.
+
+2011-08-02  Yannick Moy  <moy@adacore.com>
+
        * errout.adb, errout.ads (Check_Formal_Restriction): move procedure
        from here...
        * restrict.adb, restrict.ads (Check_Formal_Restriction): ...to here
index 3617bea..ed7ec12 100644 (file)
@@ -92,11 +92,11 @@ GNATRTL_NONTASKING_OBJS= \
   a-cbdlli$(objext) \
   a-cborma$(objext) \
   a-cdlili$(objext) \
+  a-cfdlli$(objext) \
   a-cfhama$(objext) \
   a-cfhase$(objext) \
-  a-cforse$(objext) \
-  a-cfdlli$(objext) \
   a-cforma$(objext) \
+  a-cforse$(objext) \
   a-cgaaso$(objext) \
   a-cgarso$(objext) \
   a-cgcaso$(objext) \
index 4f70f81..ed34d0e 100644 (file)
@@ -8,6 +8,10 @@
 --                                                                          --
 --          Copyright (C) 2010, Free Software Foundation, Inc.              --
 --                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
index 34a8a43..bc83c9d 100644 (file)
@@ -8,6 +8,10 @@
 --                                                                          --
 --          Copyright (C) 2010, Free Software Foundation, Inc.              --
 --                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
index ed514c8..0df686d 100644 (file)
@@ -8,6 +8,10 @@
 --                                                                          --
 --          Copyright (C) 2010, Free Software Foundation, Inc.              --
 --                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
index 705fd61..f451917 100644 (file)
@@ -8,6 +8,10 @@
 --                                                                          --
 --          Copyright (C) 2010, Free Software Foundation, Inc.              --
 --                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
index 30a0f97..229af23 100644 (file)
@@ -8,6 +8,10 @@
 --                                                                          --
 --          Copyright (C) 2010, Free Software Foundation, Inc.              --
 --                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
index fd30ca9..a0fddf9 100644 (file)
@@ -8,6 +8,10 @@
 --                                                                          --
 --          Copyright (C) 2010, Free Software Foundation, Inc.              --
 --                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
index b17d7b9..5d1928d 100644 (file)
@@ -1442,7 +1442,6 @@ package body Bindgen is
             end if;
          end;
       end loop;
-
    end Gen_Elab_Calls_C;
 
    ----------------------
@@ -3030,6 +3029,10 @@ package body Bindgen is
       procedure Increment_Ubuf;
       --  Little procedure to increment the serial number
 
+      --------------------
+      -- Increment_Ubuf --
+      --------------------
+
       procedure Increment_Ubuf is
       begin
          for J in reverse Ubuf'Range loop
@@ -3081,7 +3084,6 @@ package body Bindgen is
             Write_Statement_Buffer;
          end if;
       end loop;
-
    end Gen_Versions_Ada;
 
    --------------------
@@ -3129,7 +3131,6 @@ package body Bindgen is
             Write_Statement_Buffer;
          end if;
       end loop;
-
    end Gen_Versions_C;
 
    ------------------------
index de3084f..2c83bf2 100644 (file)
@@ -469,12 +469,11 @@ procedure Gnatbind is
    end Scan_Bind_Arg;
 
    procedure Check_Version_And_Help is
-      new Check_Version_And_Help_G (Bindusg.Display);
+     new Check_Version_And_Help_G (Bindusg.Display);
 
 --  Start of processing for Gnatbind
 
 begin
-
    --  Set default for Shared_Libgnat option
 
    declare
@@ -876,9 +875,8 @@ begin
                   -- Put_In_Sources --
                   --------------------
 
-                  function Put_In_Sources (S : File_Name_Type)
-                                           return Boolean
-                  is
+                  function Put_In_Sources
+                    (S : File_Name_Type) return Boolean is
                   begin
                      for J in 1 .. Closure_Sources.Last loop
                         if Closure_Sources.Table (J) = S then
@@ -978,5 +976,4 @@ begin
 
       null;
    end if;
-
 end Gnatbind;
index 5bf4666..5fe7c74 100644 (file)
@@ -2213,7 +2213,6 @@ package body Make is
             Check_File (Name_Find);
          end if;
       end loop;
-
    end Check_Linker_Options;
 
    -----------------
@@ -6066,21 +6065,19 @@ package body Make is
                      end loop;
 
                      for Index in 1 .. Library_Projs.Last loop
-                        if Library_Projs.Table
-                          (Index).Library_Kind = Static
+                        if Library_Projs.Table (Index).Library_Kind = Static
                           and then not Targparm.OpenVMS_On_Target
                         then
                            Linker_Switches.Increment_Last;
                            Linker_Switches.Table (Linker_Switches.Last) :=
                              new String'
                                (Get_Name_String
-                                    (Library_Projs.Table (Index).
-                                       Library_Dir.Display_Name) &
+                                 (Library_Projs.Table
+                                   (Index).Library_Dir.Display_Name) &
                                 Directory_Separator &
                                 "lib" &
                                 Get_Name_String
-                                    (Library_Projs.Table (Index).
-                                     Library_Name) &
+                                  (Library_Projs.Table (Index). Library_Name) &
                                 "." &
                                 MLib.Tgt.Archive_Ext);
 
@@ -6109,7 +6106,7 @@ package body Make is
                   if Libraries_Present then
 
                      --  If Path_Option is not null, create the switch
-                     --  ("-Wl,-rpath," or equivalent) with all the non static
+                     --  ("-Wl,-rpath," or equivalent) with all the non-static
                      --  library dirs plus the standard GNAT library dir.
                      --  We do that only if Run_Path_Option is True
                      --  (not disabled by -R switch).
@@ -6134,17 +6131,19 @@ package body Make is
                               loop
                                  Linker_Switches.Increment_Last;
                                  Linker_Switches.Table
-                                   (Linker_Switches.Last) := new String'
-                                   (Path_Option.all &
-                                    Library_Paths.Table (Index).all);
+                                   (Linker_Switches.Last) :=
+                                     new String'
+                                       (Path_Option.all &
+                                        Library_Paths.Table (Index).all);
                               end loop;
 
                               --  One switch for the standard GNAT library dir
 
                               Linker_Switches.Increment_Last;
                               Linker_Switches.Table
-                                (Linker_Switches.Last) := new String'
-                                (Path_Option.all & MLib.Utl.Lib_Directory);
+                                (Linker_Switches.Last) :=
+                                  new String'
+                                    (Path_Option.all & MLib.Utl.Lib_Directory);
 
                            else
                               --  We are going to create one switch of the form
@@ -6178,8 +6177,8 @@ package body Make is
                               loop
                                  Option
                                    (Current + 1 ..
-                                      Current +
-                                        Library_Paths.Table (Index)'Length) :=
+                                     Current +
+                                       Library_Paths.Table (Index)'Length) :=
                                    Library_Paths.Table (Index).all;
                                  Current :=
                                    Current +
@@ -6351,19 +6350,19 @@ package body Make is
                                                  not Unique_Compile);
 
                   The_Packages : constant Package_Id :=
-                    Main_Project.Decl.Packages;
+                                   Main_Project.Decl.Packages;
 
                   Binder_Package : constant Prj.Package_Id :=
-                               Prj.Util.Value_Of
-                                 (Name        => Name_Binder,
-                                  In_Packages => The_Packages,
-                                  In_Tree     => Project_Tree);
+                                     Prj.Util.Value_Of
+                                       (Name        => Name_Binder,
+                                        In_Packages => The_Packages,
+                                        In_Tree     => Project_Tree);
 
                   Linker_Package : constant Prj.Package_Id :=
-                               Prj.Util.Value_Of
-                                 (Name        => Name_Linker,
-                                  In_Packages => The_Packages,
-                                  In_Tree     => Project_Tree);
+                                     Prj.Util.Value_Of
+                                       (Name        => Name_Linker,
+                                        In_Packages => The_Packages,
+                                        In_Tree     => Project_Tree);
 
                begin
                   --  We fail if we cannot find the main source file
index 8feffc0..4050382 100644 (file)
@@ -91,6 +91,9 @@ package body MLib.Prj is
    Compile_Switch_String : aliased String := "-c";
    Compile_Switch : constant String_Access := Compile_Switch_String'Access;
 
+   No_Warning_String : aliased String := "-gnatws";
+   No_Warning : constant String_Access := No_Warning_String'Access;
+
    Auto_Initialize : constant String := "-a";
 
    --  List of objects to put inside the library
@@ -1184,8 +1187,9 @@ package body MLib.Prj is
                Arguments := new String_List (1 .. Initial_Argument_Max);
             end if;
 
-            Argument_Number := 1;
+            Argument_Number := 2;
             Arguments (1) := Compile_Switch;
+            Arguments (2) := No_Warning;
 
             if OpenVMS_On_Target then
                B_Start := new String'("b__");
@@ -1258,7 +1262,7 @@ package body MLib.Prj is
 
             --  Process binder generated file for pragmas Linker_Options
 
-            Process_Binder_File (Arguments (2).all & ASCII.NUL);
+            Process_Binder_File (Arguments (3).all & ASCII.NUL);
          end if;
       end if;
 
index 2835caf..566995d 100644 (file)
@@ -98,6 +98,15 @@ package body Sem_Aggr is
    --  expressions allowed for a limited component association (namely, an
    --  aggregate, function call, or <> notation). Report error for violations.
 
+   procedure Check_Qualified_Aggregate (Level : Nat; Expr : Node_Id);
+   --  Given aggregate Expr, check that sub-aggregates of Expr that are nested
+   --  at Level are qualified. If Level = 0, this applies to Expr directly.
+   --  Only issue errors in formal verification mode.
+
+   function Is_Top_Level_Aggregate (Expr : Node_Id) return Boolean;
+   --  Return True of Expr is an aggregate not contained directly in another
+   --  aggregate.
+
    ------------------------------------------------------
    -- Subprograms used for RECORD AGGREGATE Processing --
    ------------------------------------------------------
@@ -789,6 +798,41 @@ package body Sem_Aggr is
       end if;
    end Check_Expr_OK_In_Limited_Aggregate;
 
+   -------------------------------
+   -- Check_Qualified_Aggregate --
+   -------------------------------
+
+   procedure Check_Qualified_Aggregate (Level : Nat; Expr : Node_Id) is
+      Comp_Expr : Node_Id;
+      Comp_Assn : Node_Id;
+   begin
+      if Level = 0 then
+         if Nkind (Parent (Expr)) /= N_Qualified_Expression then
+            Check_Formal_Restriction ("aggregate should be qualified", Expr);
+         end if;
+      else
+         Comp_Expr := First (Expressions (Expr));
+         while Present (Comp_Expr) loop
+            if Nkind (Comp_Expr) = N_Aggregate then
+               Check_Qualified_Aggregate (Level - 1, Comp_Expr);
+            end if;
+
+            Comp_Expr := Next (Comp_Expr);
+         end loop;
+
+         Comp_Assn := First (Component_Associations (Expr));
+         while Present (Comp_Assn) loop
+            Comp_Expr := Expression (Comp_Assn);
+
+            if Nkind (Comp_Expr) = N_Aggregate then
+               Check_Qualified_Aggregate (Level - 1, Comp_Expr);
+            end if;
+
+            Comp_Assn := Next (Comp_Assn);
+         end loop;
+      end if;
+   end Check_Qualified_Aggregate;
+
    ----------------------------------------
    -- Check_Static_Discriminated_Subtype --
    ----------------------------------------
@@ -861,6 +905,17 @@ package body Sem_Aggr is
             = N_Others_Choice;
    end Is_Others_Aggregate;
 
+   ----------------------------
+   -- Is_Top_Level_Aggregate --
+   ----------------------------
+
+   function Is_Top_Level_Aggregate (Expr : Node_Id) return Boolean is
+   begin
+      return Nkind (Parent (Expr)) /= N_Aggregate
+        and then (Nkind (Parent (Expr)) /= N_Component_Association
+                   or else Nkind (Parent (Parent (Expr))) /= N_Aggregate);
+   end Is_Top_Level_Aggregate;
+
    --------------------------------
    -- Make_String_Into_Aggregate --
    --------------------------------
@@ -921,6 +976,39 @@ package body Sem_Aggr is
          return;
       end if;
 
+      --  An unqualified aggregate is restricted in SPARK or ALFA to:
+
+      --    An aggregate item inside an aggregate for a multi-dimensional array
+
+      --    An expression being assigned to an unconstrained array, but only if
+      --    the aggregate specifies a value for OTHERS only.
+
+      if Nkind (Parent (N)) = N_Qualified_Expression then
+         if Is_Array_Type (Typ) then
+            Check_Qualified_Aggregate (Number_Dimensions (Typ), N);
+         else
+            Check_Qualified_Aggregate (1, N);
+         end if;
+      else
+         if Is_Array_Type (Typ)
+           and then Nkind (Parent (N)) = N_Assignment_Statement
+           and then not Is_Constrained (Etype (Name (Parent (N))))
+           and then not Is_Others_Aggregate (N)
+         then
+            Check_Formal_Restriction
+              ("array aggregate should have only OTHERS", N);
+         elsif Is_Top_Level_Aggregate (N) then
+            Check_Formal_Restriction ("aggregate should be qualified", N);
+
+         --  The legality of this unqualified aggregate is checked by calling
+         --  Check_Qualified_Aggregate from one of its enclosing aggregate,
+         --  unless one of these already causes an error to be issued.
+
+         else
+            null;
+         end if;
+      end if;
+
       --  Check for aggregates not allowed in configurable run-time mode.
       --  We allow all cases of aggregates that do not come from source, since
       --  these are all assumed to be small (e.g. bounds of a string literal).
@@ -1098,49 +1186,6 @@ package body Sem_Aggr is
          Error_Msg_N ("illegal context for aggregate", N);
       end if;
 
-      --  An unqualified aggregate is restricted in SPARK or ALFA to:
-
-      --    An aggregate item inside an aggregate for a multi-dimensional array
-
-      --    An expression being assigned to an unconstrained array, but only if
-      --    the aggregate specifies a value for OTHERS only.
-
-      if Nkind (Parent (N)) /= N_Qualified_Expression then
-         if Is_Array_Type (Etype (N)) then
-            if Nkind (Parent (N)) = N_Assignment_Statement
-              and then not Is_Constrained (Etype (Name (Parent (N))))
-            then
-               if not Is_Others_Aggregate (N) then
-                  Check_Formal_Restriction
-                    ("array aggregate should have only OTHERS", N);
-               end if;
-
-               --  The following check is disabled until a proper place is
-               --  found where the type of the parent node can be inspected???
-
---              elsif not (Nkind (Parent (N)) = N_Aggregate
---                         and then Is_Array_Type (Etype (Parent (N)))
---                         and then Number_Dimensions (Etype (Parent (N))) > 1)
---              then
---                 Check_Formal_Restriction
---                   ("array aggregate should be qualified", N);
-            else
-               null;
-            end if;
-
-         elsif Is_Record_Type (Etype (N)) then
-            Check_Formal_Restriction
-              ("record aggregate should be qualified", N);
-
-         --  The type of aggregate is neither array nor record, so an error
-         --  must have occurred during resolution. Do not report an additional
-         --  message here.
-
-         else
-            null;
-         end if;
-      end if;
-
       --  If we can determine statically that the evaluation of the aggregate
       --  raises Constraint_Error, then replace the aggregate with an
       --  N_Raise_Constraint_Error node, but set the Etype to the right