[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 17 Oct 2014 08:42:41 +0000 (10:42 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 17 Oct 2014 08:42:41 +0000 (10:42 +0200)
2014-10-17  Robert Dewar  <dewar@adacore.com>

* sem_util.adb: Minor reformatting.

2014-10-17  Ed Schonberg  <schonberg@adacore.com>

* sem_ch12.adb (Build_Function_Wrapper): Build wrappers for
actuals that are defaulted subprograms of the formal subprogram
declaration.

2014-10-17  Robert Dewar  <dewar@adacore.com>

* exp_ch4.adb (Expand_N_Op_Eq): Make sure we deal with the
implementation base type.
* sinfo.ads: Add a note for N_Op_Eq and N_Op_Ne that record
operands are always expanded out into component comparisons.

2014-10-17  Robert Dewar  <dewar@adacore.com>

* s-vallli.adb: Minor comment correction.
* s-valuti.ads: Minor comment reformatting.

2014-10-17  Robert Dewar  <dewar@adacore.com>

* gnat_rm.texi: Document System.Atomic_Counters.
* impunit.adb: Add System.Atomic_Counters (s-atocou.ads) to the
list of user- accessible units added as children of System.
* s-atocou.ads: Update comment.

2014-10-17  Arnaud Charlet  <charlet@adacore.com>

* s-expmod.ads: Add comments.

From-SVN: r216371

gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb
gcc/ada/gnat_rm.texi
gcc/ada/impunit.adb
gcc/ada/s-atocou.ads
gcc/ada/s-expmod.ads
gcc/ada/s-vallli.adb
gcc/ada/s-valuti.ads
gcc/ada/sem_ch12.adb
gcc/ada/sem_util.adb
gcc/ada/sinfo.ads

index df07e44141ccbb8f4c8117028b49b3da60908ed7..b40757165eed7f823f1aebff6254f9a5224aeb36 100644 (file)
@@ -1,3 +1,36 @@
+2014-10-17  Robert Dewar  <dewar@adacore.com>
+
+       * sem_util.adb: Minor reformatting.
+
+2014-10-17  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch12.adb (Build_Function_Wrapper): Build wrappers for
+       actuals that are defaulted subprograms of the formal subprogram
+       declaration.
+
+2014-10-17  Robert Dewar  <dewar@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Op_Eq): Make sure we deal with the
+       implementation base type.
+       * sinfo.ads: Add a note for N_Op_Eq and N_Op_Ne that record
+       operands are always expanded out into component comparisons.
+
+2014-10-17  Robert Dewar  <dewar@adacore.com>
+
+       * s-vallli.adb: Minor comment correction.
+       * s-valuti.ads: Minor comment reformatting.
+
+2014-10-17  Robert Dewar  <dewar@adacore.com>
+
+       * gnat_rm.texi: Document System.Atomic_Counters.
+       * impunit.adb: Add System.Atomic_Counters (s-atocou.ads) to the
+       list of user- accessible units added as children of System.
+       * s-atocou.ads: Update comment.
+
+2014-10-17  Arnaud Charlet  <charlet@adacore.com>
+
+       * s-expmod.ads: Add comments.
+
 2014-10-17  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * sem_ch3.adb (Build_Derived_Record_Type): Remove the propagation
index 9068fdcdfbb5f5b1c433d24dfd714f3def61f6ef..5fdba539c28d3df7e37fab83d0b1430b1e599555 100644 (file)
@@ -7152,7 +7152,10 @@ package body Exp_Ch4 is
          return;
       end if;
 
-      Typl := Base_Type (Typl);
+      --  Now get the implementation base type (note that plain Base_Type here
+      --  might lead us back to the private type, which is not what we want!)
+
+      Typl := Implementation_Base_Type (Typl);
 
       --  Equality between variant records results in a call to a routine
       --  that has conditional tests of the discriminant value(s), and hence
index b0bed4b15cb5bd227e036d9c181b8c0f26b2e8e7..4258722a9393cb6eab4df8237c7f3b9289ef7d61 100644 (file)
@@ -661,6 +661,7 @@ The GNAT Library
 * Interfaces.VxWorks.IO (i-vxwoio.ads)::
 * System.Address_Image (s-addima.ads)::
 * System.Assertions (s-assert.ads)::
+* System.Atomic_Counters (s-atocou.ads)::
 * System.Memory (s-memory.ads)::
 * System.Multiprocessors (s-multip.ads)::
 * System.Multiprocessors.Dispatching_Domains (s-mudido.ads)::
@@ -19074,6 +19075,7 @@ of GNAT, and will generate a warning message.
 * Interfaces.VxWorks.IO (i-vxwoio.ads)::
 * System.Address_Image (s-addima.ads)::
 * System.Assertions (s-assert.ads)::
+* System.Atomic_Counters (s-atocou.ads)::
 * System.Memory (s-memory.ads)::
 * System.Multiprocessors (s-multip.ads)::
 * System.Multiprocessors.Dispatching_Domains (s-mudido.ads)::
@@ -20585,6 +20587,18 @@ This package provides the declaration of the exception raised
 by an run-time assertion failure, as well as the routine that
 is used internally to raise this assertion.
 
+@node System.Atomic_Counters (s-atocou.ads)
+@section @code{System.Atomic_Counters} (@file{s-atocou.ads})
+@cindex @code{System.Atomic_Counters} (@file{s-atocou.ads})
+
+@noindent
+This package provides the declaration of an atomic counter type,
+together with efficient routines (using hardware
+synchronization primitives) for incrementing, decrementing,
+and testing of these counters. This package is implemented
+on most targets, including all Alpha, ia64, PowerPC, SPARC V9,
+x86, and x86_64 platforms.
+
 @node System.Memory (s-memory.ads)
 @section @code{System.Memory} (@file{s-memory.ads})
 @cindex @code{System.Memory} (@file{s-memory.ads})
index 69356cbfb34f1b52974fe5a09c73706adee06be8..49baf1651c2bab85cff8c5e5c3ea476a82663393 100644 (file)
@@ -367,6 +367,7 @@ package body Impunit is
    --------------------------------------
 
     ("s-addima", F),  -- System.Address_Image
+    ("s-atocou", F),  -- System.Atomic_Counters
     ("s-assert", F),  -- System.Assertions
     ("s-diflio", F),  -- System.Dim.Float_IO
     ("s-diinio", F),  -- System.Dim.Integer_IO
index 55d6bf0ece83772f4993aa05a1efe8b8a5851005..a2e6d897efb469a722b65c8137c18de42798004d 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 2011-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 2011-2014, 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- --
@@ -37,8 +37,6 @@
 --    - all x86 platforms
 --    - all x86_64 platforms
 
---  Why isn't this package available to application programs???
-
 package System.Atomic_Counters is
 
    pragma Preelaborate;
@@ -59,20 +57,19 @@ package System.Atomic_Counters is
 
    function Decrement (Item : in out Atomic_Counter) return Boolean;
    pragma Inline_Always (Decrement);
-   --  Decrements value of atomic counter, returns True when value reach zero.
+   --  Decrements value of atomic counter, returns True when value reach zero
 
    function Is_One (Item : Atomic_Counter) return Boolean;
    pragma Inline_Always (Is_One);
-   --  Returns True when value of the atomic counter is one.
+   --  Returns True when value of the atomic counter is one
 
    procedure Initialize (Item : out Atomic_Counter);
    pragma Inline_Always (Initialize);
    --  Initialize counter by setting its value to one. This subprogram is
-   --  intended to be used in special cases when counter object can't be
+   --  intended to be used in special cases when the counter object cannot be
    --  initialized in standard way.
 
 private
-
    type Unsigned_32 is mod 2 ** 32;
 
    type Atomic_Counter is limited record
index 3dd118d5e9fe6c32785122a9b636c6fb345da105..c90691523b0eb5a68b69a9f51cc74258129b789c 100644 (file)
 --  This function performs exponentiation of a modular type with non-binary
 --  modulus values. Arithmetic is done in Long_Long_Unsigned, with explicit
 --  accounting for the modulus value which is passed as the second argument.
+--  Note that 1 is a binary modulus (2**0), so the compiler should not (and
+--  will not) call this function with Modulus equal to 1).
 
 with System.Unsigned_Types;
 
 package System.Exp_Mod is
    pragma Pure;
+   use type System.Unsigned_Types.Unsigned;
+
+   subtype Power_Of_2 is System.Unsigned_Types.Unsigned with
+     Dynamic_Predicate =>
+        Power_Of_2 /= 0 and then (Power_Of_2 and (Power_Of_2 - 1)) = 0;
 
    function Exp_Modular
      (Left    : System.Unsigned_Types.Unsigned;
       Modulus : System.Unsigned_Types.Unsigned;
-      Right   : Natural) return System.Unsigned_Types.Unsigned;
+      Right   : Natural) return System.Unsigned_Types.Unsigned
+   with
+       Pre  => Modulus /= 0 and then Modulus not in Power_Of_2,
+       Post => Exp_Modular'Result = Left ** Right mod Modulus;
 
 end System.Exp_Mod;
index 035a95d0c9940724b6c426a0aa4cf3533a4e88b8..203e475b3cff5b71d889bf67db477fce1b74a344 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2012, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2014, 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- --
@@ -51,7 +51,7 @@ package body System.Val_LLI is
       --  Set to True if minus sign is present, otherwise to False
 
       Start : Positive;
-      --  Saves location of first non-blank (not used in this case)
+      --  Saves location of first non-blank
 
    begin
       Scan_Sign (Str, Ptr, Max, Minus, Start);
index ce9dc3b8ff101a663fc93170a5744ded2916c123..e69af0f089f8190453810a3624c92af187d559bb 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2012, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2014, 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- --
@@ -43,9 +43,9 @@ package System.Val_Util is
       F, L : out Integer);
    --  This procedure scans the string S setting F to be the index of the first
    --  non-blank character of S and L to be the index of the last non-blank
-   --  character of S. Any lower case characters present in S will be folded
-   --  to their upper case equivalent except for character literals. If S
-   --  consists of entirely blanks then Constraint_Error is raised.
+   --  character of S. Any lower case characters present in S will be folded to
+   --  their upper case equivalent except for character literals. If S consists
+   --  of entirely blanks then Constraint_Error is raised.
    --
    --  Note: if S is the null string, F is set to S'First, L to S'Last
 
@@ -60,25 +60,25 @@ package System.Val_Util is
    --  last character in the string). Scan_Sign first scans out any initial
    --  blanks, raising Constraint_Error if the field is all blank. It then
    --  checks for and skips an initial plus or minus, requiring a non-blank
-   --  character to follow (Constraint_Error is raised if plus or minus
-   --  appears at the end of the string or with a following blank). Minus is
-   --  set True if a minus sign was skipped, and False otherwise. On exit
-   --  Ptr.all points to the character after the sign, or to the first
-   --  non-blank character if no sign is present. Start is set to the point
-   --  to the first non-blank character (sign or digit after it).
+   --  character to follow (Constraint_Error is raised if plus or minus appears
+   --  at the end of the string or with a following blank). Minus is set True
+   --  if a minus sign was skipped, and False otherwise. On exit Ptr.all points
+   --  to the character after the sign, or to the first non-blank character
+   --  if no sign is present. Start is set to the point to the first non-blank
+   --  character (sign or digit after it).
    --
    --  Note: if Str is null, i.e. if Max is less than Ptr, then this is a
    --  special case of an all-blank string, and Ptr is unchanged, and hence
-   --  is greater than Max as required in this case. Constraint_Error is
-   --  also raised in this case.
+   --  is greater than Max as required in this case. Constraint_Error is also
+   --  raised in this case.
 
    procedure Scan_Plus_Sign
      (Str   : String;
       Ptr   : not null access Integer;
       Max   : Integer;
       Start : out Positive);
-   --  Same as Scan_Sign, but allows only plus, not minus.
-   --  This is used for modular types.
+   --  Same as Scan_Sign, but allows only plus, not minus. This is used for
+   --  modular types.
 
    function Scan_Exponent
      (Str  : String;
index c9738cc66c4001f2ccef893d76374de627ed824b..277b7eff469426388cb35acf7408f48055daf9ab 100644 (file)
@@ -1056,7 +1056,12 @@ package body Sem_Ch12 is
          Actuals := New_List;
          Profile := New_List;
 
-         F := First_Formal (Entity (Actual));
+         if Present (Actual) then
+            F := First_Formal (Entity (Actual));
+         else
+            F := First_Formal (Formal);
+         end if;
+
          N_Parms := 0;
          while Present (F) loop
 
@@ -1066,16 +1071,26 @@ package body Sem_Ch12 is
             New_F := Make_Temporary
                        (Loc, Character'Val (Character'Pos ('A') + N_Parms));
 
-            --  If a formal has a class-wide type, rewrite as the corresponding
-            --  attribute, because the class-wide type is not retrievable by
-            --  visbility.
+            if No (Actual) then
+
+               --  If formal has a class-wide type rewrite as the corresponding
+               --  attribute, because the class-wide type is not retrievable by
+               --  visbility.
+
+               if Is_Class_Wide_Type (Etype (F)) then
+                  Parm_Type :=
+                    Make_Attribute_Reference (Loc,
+                      Attribute_Name => Name_Class,
+                      Prefix         =>
+                        Make_Identifier (Loc, Chars (Etype (Etype (F)))));
+
+               else
+                  Parm_Type :=
+                    Make_Identifier (Loc, Chars (Etype (Etype (F))));
+               end if;
+
+            --  If actual is present, use the type of its own formal
 
-            if Is_Class_Wide_Type (Etype (F)) then
-               Parm_Type :=
-                 Make_Attribute_Reference (Loc,
-                   Attribute_Name => Name_Class,
-                   Prefix         =>
-                     Make_Identifier (Loc, Chars (Etype (Etype (F)))));
             else
                Parm_Type := New_Occurrence_Of (Etype (F), Loc);
             end if;
@@ -1766,8 +1781,7 @@ package body Sem_Ch12 is
 
                   else
                      if GNATprove_Mode
-                       and then
-                         Present
+                        and then Present
                            (Containing_Package_With_Ext_Axioms
                               (Defining_Entity (Analyzed_Formal)))
                        and then Ekind (Defining_Entity (Analyzed_Formal)) =
index a5c77fc7f231abb99fc4ff2dfdd9d897436c4305..1eac0b2ffd011f48931394f3b1b09ba268b44201 100644 (file)
@@ -371,8 +371,7 @@ package body Sem_Util is
             raise Program_Error;
          end if;
 
-      --  Contract items related to subprogram bodies. The applicable pragmas
-      --  are:
+      --  Contract items related to subprogram bodies. Applicable pragmas are:
       --    Refined_Depends
       --    Refined_Global
       --    Refined_Post
@@ -392,7 +391,7 @@ package body Sem_Util is
             raise Program_Error;
          end if;
 
-      --  Contract items related to variables. The applicable pragmas are:
+      --  Contract items related to variables. Applicable pragmas are:
       --    Async_Readers
       --    Async_Writers
       --    Effective_Reads
@@ -801,9 +800,7 @@ package body Sem_Util is
             return;
          end if;
 
-         if Is_Generic_Formal (Typ)
-           and then Is_Discrete_Type (Typ)
-         then
+         if Is_Generic_Formal (Typ) and then Is_Discrete_Type (Typ) then
             Set_No_Predicate_On_Actual (Typ);
          end if;
 
@@ -1442,8 +1439,7 @@ package body Sem_Util is
       pragma Assert (Has_Default_Init_Cond (Typ));
       pragma Assert (Present (Prag));
 
-      --  Nothing to do if the default initial condition procedure was already
-      --  built.
+      --  Nothing to do if default initial condition procedure already built
 
       if Present (Default_Init_Cond_Procedure (Typ)) then
          return;
@@ -1909,7 +1905,7 @@ package body Sem_Util is
                   return False;
                else
                   return
-                    Cannot_Raise_Constraint_Error (Left_Opnd (Expr))
+                    Cannot_Raise_Constraint_Error (Left_Opnd  (Expr))
                       and then
                     Cannot_Raise_Constraint_Error (Right_Opnd (Expr));
                end if;
@@ -1938,7 +1934,7 @@ package body Sem_Util is
                   return False;
                else
                   return
-                    Cannot_Raise_Constraint_Error (Left_Opnd (Expr))
+                    Cannot_Raise_Constraint_Error (Left_Opnd  (Expr))
                       and then
                     Cannot_Raise_Constraint_Error (Right_Opnd (Expr));
                end if;
@@ -1992,6 +1988,7 @@ package body Sem_Util is
            and then Ekind (Non_Limited_View (T)) /= E_Incomplete_Type
          then
             --  The non-limited view is fully declared
+
             null;
 
          else
@@ -2429,7 +2426,7 @@ package body Sem_Util is
                            elsif Nkind_In (Choice, N_Range,
                                                    N_Subtype_Indication)
                              or else (Is_Entity_Name (Choice)
-                                        and then Is_Type (Entity (Choice)))
+                                       and then Is_Type (Entity (Choice)))
                            then
                               declare
                                  L, H : Node_Id;
@@ -3049,7 +3046,8 @@ package body Sem_Util is
            Comes_From_Source (N)
              and then Is_Entity_Name (N)
              and then (Entity (N) = Standard_True
-                        or else Entity (N) = Standard_False);
+                         or else
+                       Entity (N) = Standard_False);
       end Is_Trivial_Boolean;
 
       -------------------------
@@ -4747,7 +4745,8 @@ package body Sem_Util is
             --  attempt to detect partial overlap of slices.
 
             return Denotes_Same_Object (Lo1, Lo2)
-              and then Denotes_Same_Object (Hi1, Hi2);
+                     and then
+                   Denotes_Same_Object (Hi1, Hi2);
          end;
 
       --  In the recursion, literals appear as indexes
@@ -4788,7 +4787,7 @@ package body Sem_Util is
             Nkind_In (A2, N_Selected_Component, N_Indexed_Component, N_Slice)
       then
          declare
-            Root1, Root2 : Node_Id;
+            Root1, Root2   : Node_Id;
             Depth1, Depth2 : Int := 0;
 
          begin
@@ -4807,8 +4806,8 @@ package body Sem_Util is
 
             Root2 := Prefix (A2);
             while not Is_Entity_Name (Root2) loop
-               if not Nkind_In
-                 (Root2, N_Selected_Component, N_Indexed_Component)
+               if not Nkind_In (Root2, N_Selected_Component,
+                                       N_Indexed_Component)
                then
                   return False;
                else
@@ -4826,7 +4825,7 @@ package body Sem_Util is
 
             elsif Depth1 > Depth2 then
                Root1 := Prefix (A1);
-               for I in 1 .. Depth1 - Depth2 - 1 loop
+               for J in 1 .. Depth1 - Depth2 - 1 loop
                   Root1 := Prefix (Root1);
                end loop;
 
@@ -4834,7 +4833,7 @@ package body Sem_Util is
 
             else
                Root2 := Prefix (A2);
-               for I in 1 .. Depth2 - Depth1 - 1 loop
+               for J in 1 .. Depth2 - Depth1 - 1 loop
                   Root2 := Prefix (Root2);
                end loop;
 
@@ -4897,7 +4896,6 @@ package body Sem_Util is
       begin
          if Nkind (N) = N_Defining_Program_Unit_Name then
             return Name (N);
-
          else
             return Prefix (N);
          end if;
@@ -4911,7 +4909,6 @@ package body Sem_Util is
       begin
          if Nkind (N) = N_Defining_Program_Unit_Name then
             return Defining_Identifier (N);
-
          else
             return Selector_Name (N);
          end if;
@@ -6552,9 +6549,8 @@ package body Sem_Util is
          if In_Spec_Expression then
             return Typ;
 
-         elsif Is_Private_Type (Typ)
-           and then not Has_Discriminants (Typ)
-         then
+         elsif Is_Private_Type (Typ) and then not Has_Discriminants (Typ) then
+
             --  If the type has no discriminants, there is no subtype to
             --  build, even if the underlying type is discriminated.
 
@@ -6793,7 +6789,6 @@ package body Sem_Util is
       --  For all other cases, we have a complete table of literals, and
       --  we simply iterate through the chain of literal until the one
       --  with the desired position value is found.
-      --
 
       else
          if Is_Private_Type (Btyp) and then Present (Full_View (Btyp)) then
@@ -7579,7 +7574,7 @@ package body Sem_Util is
 
          elsif Default /= Unknown
            and then (Has_Size_Clause      (Etype (Expr))
-                      or else
+                       or else
                      Has_Alignment_Clause (Etype (Expr)))
          then
             Set_Result (Unknown);
@@ -7881,13 +7876,13 @@ package body Sem_Util is
          --  property is enabled when the flag evaluates to True or the flag is
          --  missing altogether.
 
-         elsif Property = Name_Async_Readers and then Is_Enabled (AR) then
+         elsif Property = Name_Async_Readers    and then Is_Enabled (AR) then
             return True;
 
-         elsif Property = Name_Async_Writers and then Is_Enabled (AW) then
+         elsif Property = Name_Async_Writers    and then Is_Enabled (AW) then
             return True;
 
-         elsif Property = Name_Effective_Reads and then Is_Enabled (ER) then
+         elsif Property = Name_Effective_Reads  and then Is_Enabled (ER) then
             return True;
 
          elsif Property = Name_Effective_Writes and then Is_Enabled (EW) then
@@ -8027,7 +8022,7 @@ package body Sem_Util is
 
       elsif Nkind (N) in N_Binary_Op or else Nkind (N) in N_Short_Circuit then
          return Has_No_Obvious_Side_Effects (Left_Opnd  (N))
-                  and then
+                   and then
                 Has_No_Obvious_Side_Effects (Right_Opnd (N));
 
       elsif Nkind (N) = N_Expression_With_Actions
@@ -8247,10 +8242,8 @@ package body Sem_Util is
             elsif Is_Entity_Name (N)
               and then
                 (Ekind (Entity (N)) = E_Discriminant
-                  or else
-                    ((Ekind (Entity (N)) = E_Constant
-                       or else Ekind (Entity (N)) = E_In_Parameter)
-                     and then Present (Discriminal_Link (Entity (N)))))
+                  or else (Ekind_In (Entity (N), E_Constant, E_In_Parameter)
+                            and then Present (Discriminal_Link (Entity (N)))))
             then
                return True;
 
@@ -8260,9 +8253,7 @@ package body Sem_Util is
             --  For aggregates we have to check that each of the associations
             --  is preelaborable.
 
-            elsif Nkind (N) = N_Aggregate
-              or else Nkind (N) = N_Extension_Aggregate
-            then
+            elsif Nkind_In (N, N_Aggregate, N_Extension_Aggregate) then
                Is_Array_Aggr := Is_Array_Type (Etype (N));
 
                if Is_Array_Aggr then
@@ -8564,7 +8555,8 @@ package body Sem_Util is
             if No (UT) then
                if No (Full_View (Btype)) then
                   return not Is_Generic_Type (Btype)
-                    and then not Is_Generic_Type (Root_Type (Btype));
+                            and then
+                         not Is_Generic_Type (Root_Type (Btype));
                else
                   return not Is_Generic_Type (Root_Type (Full_View (Btype)));
                end if;
@@ -8749,9 +8741,7 @@ package body Sem_Util is
       Comp : Entity_Id;
 
    begin
-      if Is_Private_Type (Typ)
-        and then Present (Underlying_Type (Typ))
-      then
+      if Is_Private_Type (Typ) and then Present (Underlying_Type (Typ)) then
          return Has_Tagged_Component (Underlying_Type (Typ));
 
       elsif Is_Array_Type (Typ) then
@@ -8926,9 +8916,7 @@ package body Sem_Util is
    begin
       S := Current_Scope;
       while Present (S) and then S /= Standard_Standard loop
-         if (Ekind (S) = E_Function
-              or else Ekind (S) = E_Package
-              or else Ekind (S) = E_Procedure)
+         if Ekind_In (S, E_Function, E_Package, E_Procedure)
            and then Is_Generic_Instance (S)
          then
             --  A child instance is always compiled in the context of a parent
@@ -9479,8 +9467,8 @@ package body Sem_Util is
                            and then Is_Aliased_View (Renamed_Object (E)))))
 
            or else ((Is_Formal (E)
-                      or else Ekind (E) = E_Generic_In_Out_Parameter
-                      or else Ekind (E) = E_Generic_In_Parameter)
+                      or else Ekind_In (E, E_Generic_In_Out_Parameter,
+                                           E_Generic_In_Parameter))
                     and then Is_Tagged_Type (Etype (E)))
 
            or else (Is_Concurrent_Type (E) and then In_Open_Scopes (E))
@@ -9842,9 +9830,9 @@ package body Sem_Util is
    begin
       return Is_Interface (T)
         and then
-            (Is_Protected_Interface (T)
-               or else Is_Synchronized_Interface (T)
-               or else Is_Task_Interface (T));
+          (Is_Protected_Interface (T)
+            or else Is_Synchronized_Interface (T)
+            or else Is_Task_Interface (T));
    end Is_Concurrent_Interface;
 
    ---------------------------
@@ -10282,9 +10270,9 @@ package body Sem_Util is
             if not Is_Constrained (Prefix_Type)
               and then (not Is_Indefinite_Subtype (Prefix_Type)
                          or else
-                          (Is_Generic_Type (Prefix_Type)
-                            and then Ekind (Current_Scope) = E_Generic_Package
-                            and then In_Package_Body (Current_Scope)))
+                           (Is_Generic_Type (Prefix_Type)
+                             and then Ekind (Current_Scope) = E_Generic_Package
+                             and then In_Package_Body (Current_Scope)))
 
               and then (Is_Declared_Within_Variant (Comp)
                          or else Has_Discriminant_Dependent_Constraint (Comp))
@@ -10518,11 +10506,17 @@ package body Sem_Util is
 
    function Is_Fully_Initialized_Type (Typ : Entity_Id) return Boolean is
    begin
-      --  In Ada2012, a scalar type with an aspect Default_Value
-      --  is fully initialized.
+      --  Scalar types
 
       if Is_Scalar_Type (Typ) then
-         return Ada_Version >= Ada_2012 and then Has_Default_Aspect (Typ);
+
+         --  A scalar type with an aspect Default_Value is fully initialized
+
+         --  Note: Iniitalize/Normalize_Scalars also ensure full initialization
+         --  of a scalar type, but we don't take that into account here, since
+         --  we don't want these to affect warnings.
+
+         return Has_Default_Aspect (Typ);
 
       elsif Is_Access_Type (Typ) then
          return True;
@@ -11786,7 +11780,10 @@ package body Sem_Util is
             Comp_Assn := First (Component_Associations (Orig_N));
             while Present (Comp_Assn) loop
                Expr := Expression (Comp_Assn);
-               if Present (Expr)  --  needed for box association
+
+               --  Note: test for Present here needed for box assocation
+
+               if Present (Expr)
                  and then not Is_SPARK_05_Initialization_Expr (Expr)
                then
                   Is_Ok := False;
@@ -11890,7 +11887,8 @@ package body Sem_Util is
 
       return (Is_Tagged_Type (E)
                 and then (Kind = E_Task_Type
-                           or else Kind = E_Protected_Type))
+                            or else
+                          Kind = E_Protected_Type))
             or else
              (Is_Interface (E)
                 and then Is_Synchronized_Interface (E))
@@ -12215,13 +12213,13 @@ package body Sem_Util is
             K : constant Entity_Kind := Ekind (E);
 
          begin
-            return     (K = E_Variable
-                         and then Nkind (Parent (E)) /= N_Exception_Handler)
-              or else  (K = E_Component
-                         and then not In_Protected_Function (E))
-              or else  K = E_Out_Parameter
-              or else  K = E_In_Out_Parameter
-              or else  K = E_Generic_In_Out_Parameter
+            return    (K = E_Variable
+                        and then Nkind (Parent (E)) /= N_Exception_Handler)
+              or else (K = E_Component
+                        and then not In_Protected_Function (E))
+              or else K = E_Out_Parameter
+              or else K = E_In_Out_Parameter
+              or else K = E_Generic_In_Out_Parameter
 
               --  Current instance of type. If this is a protected type, check
               --  we are not within the body of one of its protected functions.
@@ -12270,10 +12268,10 @@ package body Sem_Util is
                return Is_Variable (Expression (Orig_Node))
                  and then
                    (not Comes_From_Source (Orig_Node)
-                      or else
-                        (Is_Tagged_Type (Etype (Subtype_Mark (Orig_Node)))
-                          and then
-                         Is_Tagged_Type (Etype (Expression (Orig_Node)))));
+                     or else
+                       (Is_Tagged_Type (Etype (Subtype_Mark (Orig_Node)))
+                         and then
+                        Is_Tagged_Type (Etype (Expression (Orig_Node)))));
 
             --  GNAT allows an unchecked type conversion as a variable. This
             --  only affects the generation of internal expanded code, since
@@ -13103,9 +13101,9 @@ package body Sem_Util is
       end if;
    end New_Copy_List_Tree;
 
-   -------------------
-   -- New_Copy_Tree --
-   -------------------
+   --------------------------------------------------
+   -- New_Copy_Tree Auxiliary Data and Subprograms --
+   --------------------------------------------------
 
    use Atree.Unchecked_Access;
    use Atree_Private_Part;
@@ -13168,7 +13166,9 @@ package body Sem_Util is
      Hash       => New_Copy_Hash,
      Equal      => Types."=");
 
-   --  Start of processing for New_Copy_Tree function
+   -------------------
+   -- New_Copy_Tree --
+   -------------------
 
    function New_Copy_Tree
      (Source    : Node_Id;
@@ -14321,9 +14321,9 @@ package body Sem_Util is
                      then
                         if No (Actuals)
                           and then
-                           Nkind_In (Parent (N), N_Procedure_Call_Statement,
-                                                 N_Function_Call,
-                                                 N_Parameter_Association)
+                            Nkind_In (Parent (N), N_Procedure_Call_Statement,
+                                                  N_Function_Call,
+                                                  N_Parameter_Association)
                           and then Ekind (S) /= E_Function
                         then
                            Set_Etype (N, Etype (S));
@@ -14332,8 +14332,8 @@ package body Sem_Util is
                            Error_Msg_Name_1 := Chars (S);
                            Error_Msg_Sloc := Sloc (S);
                            Error_Msg_NE
-                             ("missing argument for parameter & " &
-                                "in call to % declared #", N, Formal);
+                             ("missing argument for parameter & "
+                              & "in call to % declared #", N, Formal);
                         end if;
 
                      elsif Is_Overloadable (S) then
@@ -14345,8 +14345,8 @@ package body Sem_Util is
                         Error_Msg_Sloc := Sloc (Parent (S));
 
                         Error_Msg_NE
-                          ("missing argument for parameter & " &
-                             "in call to % (inherited) #", N, Formal);
+                          ("missing argument for parameter & "
+                           & "in call to % (inherited) #", N, Formal);
 
                      else
                         Error_Msg_NE
@@ -14504,8 +14504,7 @@ package body Sem_Util is
                   --  sure this is a modification.
 
                   if Has_Pragma_Unmodified (Ent) and then Sure then
-                     Error_Msg_NE
-                       ("??pragma Unmodified given for &!", N, Ent);
+                     Error_Msg_NE ("??pragma Unmodified given for &!", N, Ent);
                   end if;
 
                   Set_Never_Set_In_Source (Ent, False);
@@ -15049,7 +15048,7 @@ package body Sem_Util is
       --  would cause infinite recursion.
 
       elsif Ekind (Subp) = E_Function
-        and then (Is_Predicate_Function (Subp)
+        and then (Is_Predicate_Function   (Subp)
                     or else
                   Is_Predicate_Function_M (Subp))
       then
@@ -15780,11 +15779,7 @@ package body Sem_Util is
 
       if (Ekind (Ent) = E_Variable and then No (Renamed_Object (Ent)))
             or else
-          Ekind (Ent) = E_Constant
-            or else
-          Ekind (Ent) = E_Out_Parameter
-            or else
-          Ekind (Ent) = E_In_Out_Parameter
+          Ekind_In (Ent, E_Constant, E_Out_Parameter, E_In_Out_Parameter)
       then
          null;
 
@@ -17789,6 +17784,7 @@ package body Sem_Util is
                Op : constant Node_Id := Right_Opnd (Parent (Expr));
                L  : constant Node_Id := Left_Opnd (Op);
                R  : constant Node_Id := Right_Opnd (Op);
+
             begin
                --  The case for the message is when the left operand of the
                --  comparison is the same modular type, or when it is an
index 4eaf51f1b2347fed149326ed676e708f21be9016..bfa33e0b9e46a63917fe862da98f1c7f2519143d 100644 (file)
@@ -4246,6 +4246,11 @@ package Sinfo is
       --  point operands if the Treat_Fixed_As_Integer flag is set and will
       --  thus treat these nodes in identical manner, ignoring small values.
 
+      --  Note on equality/inequality tests for records. In the expanded tree,
+      --  record comparisons are always expanded to be a series of component
+      --  comparisons, so the back end will never see an equality or inequality
+      --  operation with operands of a record type.
+
       --  Note on overflow handling: When the overflow checking mode is set to
       --  MINIMIZED or ELIMINATED, nodes for signed arithmetic operations may
       --  be modified to use a larger type for the operands and result. In