[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 18 Apr 2016 10:35:36 +0000 (12:35 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 18 Apr 2016 10:35:36 +0000 (12:35 +0200)
2016-04-18  Ed Schonberg  <schonberg@adacore.com>

* sem_aggr.adb (Resolve_Record_Aggregate): If
Warn_On_Redundant_Constructs is enabled, report a redundant box
association that does not cover any components, as it done for
redundant others associations in case statements.

2016-04-18  Ed Schonberg  <schonberg@adacore.com>

* sem_prag.adb (Collect_Inherited_Class_Wide_Conditions):
Analyze the generated Check pragma for an inherited condition so
that it does not freeze the dispatching type of the primitive
operation, because it is pre-analyzed at the point of the
subprogram declaration (and not in the subprogram body, as is
done during regular expansion).

2016-04-18  Vincent Celier  <celier@adacore.com>

* ali.ads: Increase the range of all _Id types to 100 millions.

2016-04-18  Gary Dismukes  <dismukes@adacore.com>

* sem_warn.adb (Check_References): Change warning to suggest
using pragma Export rather than saying "volatile has no effect".

2016-04-18  Bob Duff  <duff@adacore.com>

* g-souinf.ads (Compilation_ISO_Date): New function to return
the current date in ISO form.
* exp_intr.adb (Expand_Source_Info, Add_Source_Info): Expand
a call to Compilation_ISO_Date into a string literal containing
the current date in ISO form.
* exp_intr.ads (Add_Source_Info): Improve documentation.
* sem_intr.adb (Check_Intrinsic_Subprogram): Recognize
Compilation_ISO_Date.
* snames.ads-tmpl (Name_Compilation_ISO_Date): New Name_Id.

From-SVN: r235120

gcc/ada/ChangeLog
gcc/ada/ali.ads
gcc/ada/exp_intr.adb
gcc/ada/exp_intr.ads
gcc/ada/g-souinf.ads
gcc/ada/sem_aggr.adb
gcc/ada/sem_intr.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_warn.adb
gcc/ada/snames.ads-tmpl

index 0d7e257ba7db7baf864b7ece7ab6606564ea069f..cea9413d0c020f16b30598dbefb5fcbe9c12d484 100644 (file)
@@ -1,3 +1,40 @@
+2016-04-18  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_aggr.adb (Resolve_Record_Aggregate): If
+       Warn_On_Redundant_Constructs is enabled, report a redundant box
+       association that does not cover any components, as it done for
+       redundant others associations in case statements.
+
+2016-04-18  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_prag.adb (Collect_Inherited_Class_Wide_Conditions):
+       Analyze the generated Check pragma for an inherited condition so
+       that it does not freeze the dispatching type of the primitive
+       operation, because it is pre-analyzed at the point of the
+       subprogram declaration (and not in the subprogram body, as is
+       done during regular expansion).
+
+2016-04-18  Vincent Celier  <celier@adacore.com>
+
+       * ali.ads: Increase the range of all _Id types to 100 millions.
+
+2016-04-18  Gary Dismukes  <dismukes@adacore.com>
+
+       * sem_warn.adb (Check_References): Change warning to suggest
+       using pragma Export rather than saying "volatile has no effect".
+
+2016-04-18  Bob Duff  <duff@adacore.com>
+
+       * g-souinf.ads (Compilation_ISO_Date): New function to return
+       the current date in ISO form.
+       * exp_intr.adb (Expand_Source_Info, Add_Source_Info): Expand
+       a call to Compilation_ISO_Date into a string literal containing
+       the current date in ISO form.
+       * exp_intr.ads (Add_Source_Info): Improve documentation.
+       * sem_intr.adb (Check_Intrinsic_Subprogram): Recognize
+       Compilation_ISO_Date.
+       * snames.ads-tmpl (Name_Compilation_ISO_Date): New Name_Id.
+
 2016-04-18  Eric Botcazou  <ebotcazou@adacore.com>
 
        * layout.adb (Set_Elem_Alignment): Extend setting of alignment
index 96f6bd55a9d3f68fb02aa80f81e4e1c77cdbaf8c..eea6b461133a69f9221f0b52fed8b0812f01fac9 100644 (file)
@@ -42,32 +42,28 @@ package ALI is
    -- Id Types --
    --------------
 
-   --  The various entries are stored in tables with distinct subscript ranges.
-   --  The following type definitions show the ranges used for the subscripts
-   --  (Id values) for the various tables.
-
-   type ALI_Id is range 0 .. 999_999;
+   type ALI_Id is range 0 .. 99_999_999;
    --  Id values used for ALIs table entries
 
-   type Unit_Id is range 1_000_000 .. 1_999_999;
+   type Unit_Id is range 0 .. 99_999_999;
    --  Id values used for Unit table entries
 
-   type With_Id is range 2_000_000 .. 2_999_999;
+   type With_Id is range 0 .. 99_999_999;
    --  Id values used for Withs table entries
 
-   type Arg_Id is range 3_000_000 .. 3_999_999;
+   type Arg_Id is range 0 .. 99_999_999;
    --  Id values used for argument table entries
 
-   type Sdep_Id is range 4_000_000 .. 4_999_999;
+   type Sdep_Id is range 0 .. 99_999_999;
    --  Id values used for Sdep table entries
 
-   type Source_Id is range 5_000_000 .. 5_999_999;
+   type Source_Id is range 0 .. 99_999_999;
    --  Id values used for Source table entries
 
-   type Interrupt_State_Id is range 6_000_000 .. 6_999_999;
+   type Interrupt_State_Id is range 0 .. 99_999_999;
    --  Id values used for Interrupt_State table entries
 
-   type Priority_Specific_Dispatching_Id is range 7_000_000 .. 7_999_999;
+   type Priority_Specific_Dispatching_Id is range 0 .. 99_999_999;
    --  Id values used for Priority_Specific_Dispatching table entries
 
    --------------------
index beaa24af9e5f27951668d16b6cfd6fc126ff7cb1..b8f1fe49edd7b5da2391469447cbfb9f3db72d07 100644 (file)
@@ -107,14 +107,10 @@ package body Exp_Intr is
    --  System.Address_To_Access_Conversions.
 
    procedure Expand_Source_Info (N : Node_Id; Nam : Name_Id);
-   --  Rewrite the node by the appropriate string or positive constant.
-   --  Nam can be one of the following:
-   --    Name_File                  - expand string name of source file
-   --    Name_Line                  - expand integer line number
-   --    Name_Source_Location       - expand string of form file:line
-   --    Name_Enclosing_Entity      - expand string name of enclosing entity
-   --    Name_Compilation_Date      - expand string with compilation date
-   --    Name_Compilation_Time      - expand string with compilation time
+   --  Rewrite the node as the appropriate string literal or positive
+   --  constant. Nam is the name of one of the intrinsics declared in
+   --  GNAT.Source_Info; see g-souinf.ads for documentation of these
+   --  intrinsics.
 
    procedure Write_Entity_Name (E : Entity_Id);
    --  Recursive procedure to construct string for qualified name of enclosing
@@ -165,6 +161,10 @@ package body Exp_Intr is
 
             Write_Entity_Name (Ent);
 
+         when Name_Compilation_ISO_Date =>
+            Name_Buffer (1 .. 10) := Opt.Compilation_Time (1 .. 10);
+            Name_Len := 10;
+
          when Name_Compilation_Date =>
             declare
                subtype S13 is String (1 .. 3);
@@ -696,6 +696,7 @@ package body Exp_Intr is
                          Name_Line,
                          Name_Source_Location,
                          Name_Enclosing_Entity,
+                         Name_Compilation_ISO_Date,
                          Name_Compilation_Date,
                          Name_Compilation_Time)
       then
@@ -851,6 +852,8 @@ package body Exp_Intr is
    ------------------------
 
    procedure Expand_Source_Info (N : Node_Id; Nam : Name_Id) is
+      --  ???There is duplicated code here (see Add_Source_Info)
+
       Loc : constant Source_Ptr := Sloc (N);
       Ent : Entity_Id;
 
@@ -891,6 +894,10 @@ package body Exp_Intr is
 
                Write_Entity_Name (Ent);
 
+            when Name_Compilation_ISO_Date =>
+               Name_Buffer (1 .. 10) := Opt.Compilation_Time (1 .. 10);
+               Name_Len := 10;
+
             when Name_Compilation_Date =>
                declare
                   subtype S13 is String (1 .. 3);
index f9be797d85d157a036cad1afd51ff9e4cae68ab7..5ba07692c5d5221c8ec9020cf0a3cba76dda148e 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
 --                                                                          --
 -- 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- --
@@ -31,15 +31,11 @@ with Types; use Types;
 package Exp_Intr is
 
    procedure Add_Source_Info (Loc : Source_Ptr; Nam : Name_Id);
-   --  Append a string to Name_Buffer depending on Nam
-   --    Name_File                  - append name of source file
-   --    Name_Line                  - append line number
-   --    Name_Source_Location       - append source location (file:line)
-   --    Name_Enclosing_Entity      - append name of enclosing entity
-   --    Name_Compilation_Date      - append compilation date
-   --    Name_Compilation_Time      - append compilation time
-   --  The caller must set Name_Buffer and Name_Len before the call. Loc is
-   --  passed to provide location information where it is needed.
+   --  Append a string to Name_Buffer depending on Nam, which is the name of
+   --  one of the intrinsics declared in GNAT.Source_Info; see g-souinf.ads for
+   --  documentation of these intrinsics. The caller must set Name_Buffer and
+   --  Name_Len before the call. Loc is passed to provide location information
+   --  where it is needed.
 
    procedure Expand_Intrinsic_Call (N : Node_Id; E : Entity_Id);
    --  N is either a function call node, a procedure call statement node, or
index 610db23371883885a4e3f749b82c72bf218ad0b2..83d23d4f6727a22b01b2622f8db8d58b748f7736 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 2000-2014, Free Software Foundation, Inc.         --
+--          Copyright (C) 2000-2015, Free Software Foundation, Inc.         --
 --                                                                          --
 -- 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- --
@@ -79,6 +79,10 @@ package GNAT.Source_Info is
    --  package itself. This is useful in identifying and logging information
    --  from within generic templates.
 
+   function Compilation_ISO_Date return String with
+     Import, Convention => Intrinsic;
+   --  Returns date of compilation as a static string "yyyy-mm-dd".
+
    function Compilation_Date return String with
      Import, Convention => Intrinsic;
    --  Returns date of compilation as a static string "mmm dd yyyy". This is
index 60cd131987254729c43c30ca9b6b1021d5e53ad8..8e8b3988e6807e8e965ed37576bc8795e440f342 100644 (file)
@@ -2972,14 +2972,20 @@ package body Sem_Aggr is
       --
       --  This variable is updated as a side effect of function Get_Value.
 
+      Box_Node       : Node_Id;
       Is_Box_Present : Boolean := False;
-      Others_Box     : Boolean := False;
+      Others_Box     : Integer := 0;
+
       --  Ada 2005 (AI-287): Variables used in case of default initialization
       --  to provide a functionality similar to Others_Etype. Box_Present
       --  indicates that the component takes its default initialization;
-      --  Others_Box indicates that at least one component takes its default
-      --  initialization. Similar to Others_Etype, they are also updated as a
+      --  Others_Box counts the number of components of the current aggregate
+      --  (which may be a sub-aggregate of a larger one) that are default-
+      --  initialized. A value of One indicates that an others_box is present.
+      --  Any larger value indicates that the others_box is not redundant.
+      --  These variables, similar to Others_Etype, are also updated as a
       --  side effect of function Get_Value.
+      --  Box_Node is used to place a warning on a redundant others_box.
 
       procedure Add_Association
         (Component      : Entity_Id;
@@ -3231,7 +3237,7 @@ package body Sem_Aggr is
                      --  checks when the default includes function calls.
 
                      if Box_Present (Assoc) then
-                        Others_Box     := True;
+                        Others_Box     := Others_Box + 1;
                         Is_Box_Present := True;
 
                         if Expander_Active then
@@ -3704,7 +3710,8 @@ package body Sem_Aggr is
                   --  any component.
 
                   elsif Box_Present (Assoc) then
-                     Others_Box := True;
+                     Others_Box := 1;
+                     Box_Node   := Assoc;
                   end if;
 
                else
@@ -4439,7 +4446,8 @@ package body Sem_Aggr is
 
                               Comp_Elmt := First_Elmt (Components);
                               while Present (Comp_Elmt) loop
-                                 if Ekind (Node (Comp_Elmt)) /= E_Discriminant
+                                 if
+                                   Ekind (Node (Comp_Elmt)) /= E_Discriminant
                                  then
                                     Process_Component (Node (Comp_Elmt));
                                  end if;
@@ -4585,9 +4593,14 @@ package body Sem_Aggr is
 
                --  Ada 2005 (AI-287): others choice may have expression or box
 
-               if No (Others_Etype) and then not Others_Box then
+               if No (Others_Etype) and then Others_Box = 0 then
                   Error_Msg_N
                     ("OTHERS must represent at least one component", Selectr);
+
+               elsif Others_Box = 1 and then Warn_On_Redundant_Constructs then
+                  Error_Msg_N ("others choice is redundant?", Box_Node);
+                  Error_Msg_N ("\previous choices cover all components?",
+                     Box_Node);
                end if;
 
                exit Verification;
index 69a1d5ffd8d5bfcb925578c3566ef2b5f8db759d..e25ebb768209573ec437c1f2ca5f22e4f4074562 100644 (file)
@@ -359,6 +359,7 @@ package body Sem_Intr is
                          Name_Line,
                          Name_Source_Location,
                          Name_Enclosing_Entity,
+                         Name_Compilation_ISO_Date,
                          Name_Compilation_Date,
                          Name_Compilation_Time)
       then
index 173b14b4430c23f037586eba8f0622947f89c9c7..01971593be4ec66fcbbf565e90746d9faec8bcc0 100644 (file)
@@ -26762,9 +26762,10 @@ package body Sem_Prag is
    procedure Collect_Inherited_Class_Wide_Conditions (Subp : Entity_Id) is
       Parent_Subp : constant Entity_Id := Overridden_Operation (Subp);
       Prags       : constant Node_Id   := Contract (Parent_Subp);
-      Prag        : Node_Id;
-      New_Prag    : Node_Id;
-      Installed   : Boolean;
+      Prag         : Node_Id;
+      New_Prag     : Node_Id;
+      Installed    : Boolean;
+      In_Spec_Expr : Boolean;
 
    begin
       Installed := False;
@@ -26781,24 +26782,35 @@ package body Sem_Prag is
               and then Class_Present (Prag)
             then
                --  The generated pragma must be analyzed in the context of
-               --  the subprogram, to make its formals visible.
+               --  the subprogram, to make its formals visible. In addition,
+               --  we must inhibit freezing and full analysis because the
+               --  controlling type of the subprogram is not frozen yet, and
+               --  may have further primitives.
 
                if not Installed then
                   Installed := True;
                   Push_Scope (Subp);
                   Install_Formals (Subp);
+                  In_Spec_Expr := In_Spec_Expression;
+                  In_Spec_Expression := True;
                end if;
 
                New_Prag :=
                  Build_Pragma_Check_Equivalent (Prag, Subp, Parent_Subp);
                Insert_After (Unit_Declaration_Node (Subp), New_Prag);
                Preanalyze (New_Prag);
+
+               --  Prevent further analysis in subsequent processing of the
+               --  current list of declarations
+
+               Set_Analyzed (New_Prag);
             end if;
 
             Prag := Next_Pragma (Prag);
          end loop;
 
          if Installed then
+            In_Spec_Expression := In_Spec_Expr;
             End_Scope;
          end if;
       end if;
index 18b4e91e554faf808748d23804fc4024d2de72b4..a2fb50db7bdeb9a52f505c430aee17f9c3b53c10 100644 (file)
@@ -1137,13 +1137,17 @@ package body Sem_Warn is
                   --  A special case, if this variable is volatile and not
                   --  imported, it is not helpful to tell the programmer
                   --  to mark the variable as constant, since this would be
-                  --  illegal by virtue of RM C.6(13).
+                  --  illegal by virtue of RM C.6(13). Instead we suggest
+                  --  using pragma Export (can't be Import because of the
+                  --  initial value).
 
                   if (Is_Volatile (E1) or else Has_Volatile_Components (E1))
                     and then not Is_Imported (E1)
                   then
                      Error_Msg_N
-                       ("?k?& is not modified, volatile has no effect!", E1);
+                       ("?k?& is not modified, " &
+                          "consider pragma Export for volatile variable!",
+                        E1);
 
                   --  Another special case, Exception_Occurrence, this catches
                   --  the case of exception choice (and a bit more too, but not
index 10878063b794d6aca1f5f8dc3d30d8afd89fa940..e52a1816495212cf0ab72019982c78809beadc14 100644 (file)
@@ -1204,6 +1204,7 @@ package Snames is
    --  convention name. So is To_Address, which is a GNAT attribute.
 
    First_Intrinsic_Name                  : constant Name_Id := N + $;
+   Name_Compilation_ISO_Date             : constant Name_Id := N + $;
    Name_Compilation_Date                 : constant Name_Id := N + $;
    Name_Compilation_Time                 : constant Name_Id := N + $;
    Name_Divide                           : constant Name_Id := N + $;