[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Wed, 6 Jul 2016 13:38:37 +0000 (15:38 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 6 Jul 2016 13:38:37 +0000 (15:38 +0200)
2016-07-06  Arnaud Charlet  <charlet@adacore.com>

* lib.adb (Check_Same_Extended_Unit): Complete previous change.
* sem_intr.adb (Errint): New parameter Relaxed. Refine previous
change to only disable errors selectively.
* sem_util.adb: minor style fix in object declaration

2016-07-06  Yannick Moy  <moy@adacore.com>

* sem_warn.adb (Check_Infinite_Loop_Warning.Find_Var): Special case a
call to a volatile function, so that it does not lead to a warning in
that case.

2016-07-06  Hristian Kirtchev  <kirtchev@adacore.com>

* sem_ch12.adb, sem_ch4.adb, sem_ch6.adb: Minor reformatting.

2016-07-06  Hristian Kirtchev  <kirtchev@adacore.com>

* gnat1drv.adb: Code clean up. Do not emit any
code generation errors when the unit is ignored Ghost.

2016-07-06  Ed Schonberg  <schonberg@adacore.com>

* sem_eval.adb (Check_Non_Static_Context): If the expression
is a real literal of a floating point type that is part of a
larger expression and is not a static expression, transform it
into a machine number now so that the rest of the computation,
even if other components are static, is not evaluated with
extra precision.

2016-07-06  Javier Miranda  <miranda@adacore.com>

* sem_ch13.adb (Freeze_Entity_Checks): Undo previous patch and move the
needed functionality to Analyze_Freeze_Generic_Entity.
(Analyze_Freeze_Generic_Entity): If the entity is not already frozen
and has delayed aspects then analyze them.

2016-07-06  Yannick Moy  <moy@adacore.com>

* sem_prag.adb (Analyze_Pragma.Process_Inline.Set_Inline_Flags):
Special case for unanalyzed body entity of ghost expression function.

From-SVN: r238050

12 files changed:
gcc/ada/ChangeLog
gcc/ada/gnat1drv.adb
gcc/ada/lib.adb
gcc/ada/sem_ch12.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch4.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_eval.adb
gcc/ada/sem_intr.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_util.adb
gcc/ada/sem_warn.adb

index 8e8a370d0a1f4f93e10814041bebf55de91813d4..8f060caf8ab01c934048fe039f5f83aa9bc2957d 100644 (file)
@@ -1,3 +1,46 @@
+2016-07-06  Arnaud Charlet  <charlet@adacore.com>
+
+       * lib.adb (Check_Same_Extended_Unit): Complete previous change.
+       * sem_intr.adb (Errint): New parameter Relaxed. Refine previous
+       change to only disable errors selectively.
+       * sem_util.adb: minor style fix in object declaration
+
+2016-07-06  Yannick Moy  <moy@adacore.com>
+
+       * sem_warn.adb (Check_Infinite_Loop_Warning.Find_Var): Special case a
+       call to a volatile function, so that it does not lead to a warning in
+       that case.
+
+2016-07-06  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * sem_ch12.adb, sem_ch4.adb, sem_ch6.adb: Minor reformatting.
+
+2016-07-06  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * gnat1drv.adb: Code clean up. Do not emit any
+       code generation errors when the unit is ignored Ghost.
+
+2016-07-06  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_eval.adb (Check_Non_Static_Context): If the expression
+       is a real literal of a floating point type that is part of a
+       larger expression and is not a static expression, transform it
+       into a machine number now so that the rest of the computation,
+       even if other components are static, is not evaluated with
+       extra precision.
+
+2016-07-06  Javier Miranda  <miranda@adacore.com>
+
+       * sem_ch13.adb (Freeze_Entity_Checks): Undo previous patch and move the
+       needed functionality to Analyze_Freeze_Generic_Entity.
+       (Analyze_Freeze_Generic_Entity): If the entity is not already frozen
+       and has delayed aspects then analyze them.
+
+2016-07-06  Yannick Moy  <moy@adacore.com>
+
+       * sem_prag.adb (Analyze_Pragma.Process_Inline.Set_Inline_Flags):
+       Special case for unanalyzed body entity of ghost expression function.
+
 2016-07-06  Javier Miranda  <miranda@adacore.com>
 
        * sem_ch7.adb (Analyze_Package_Specification): Insert its
index 2ade204e6ab37f9a5ffb5c85042fe9f7ac302673..acb79a569809101f4da90a4d7193d02b7c1dcd4c 100644 (file)
@@ -89,15 +89,6 @@ with System.OS_Lib;
 --------------
 
 procedure Gnat1drv is
-   Main_Unit_Node : Node_Id;
-   --  Compilation unit node for main unit
-
-   Main_Kind : Node_Kind;
-   --  Kind of main compilation unit node
-
-   Back_End_Mode : Back_End.Back_End_Mode_Type;
-   --  Record back-end mode
-
    procedure Adjust_Global_Switches;
    --  There are various interactions between front-end switch settings,
    --  including debug switch settings and target dependent parameters.
@@ -105,8 +96,9 @@ procedure Gnat1drv is
    --  We do it after scanning out all the switches, so that we are not
    --  depending on the order in which switches appear.
 
-   procedure Check_Bad_Body;
-   --  Called to check if the unit we are compiling has a bad body
+   procedure Check_Bad_Body (Unit_Node : Node_Id; Unit_Kind : Node_Kind);
+   --  Called to check whether a unit described by its compilation unit node
+   --  and kind has a bad body.
 
    procedure Check_Rep_Info;
    --  Called when we are not generating code, to check if -gnatR was requested
@@ -712,10 +704,8 @@ procedure Gnat1drv is
    -- Check_Bad_Body --
    --------------------
 
-   procedure Check_Bad_Body is
-      Sname   : Unit_Name_Type;
-      Src_Ind : Source_File_Index;
-      Fname   : File_Name_Type;
+   procedure Check_Bad_Body (Unit_Node : Node_Id; Unit_Kind : Node_Kind) is
+      Fname : File_Name_Type;
 
       procedure Bad_Body_Error (Msg : String);
       --  Issue message for bad body found
@@ -726,11 +716,16 @@ procedure Gnat1drv is
 
       procedure Bad_Body_Error (Msg : String) is
       begin
-         Error_Msg_N (Msg, Main_Unit_Node);
+         Error_Msg_N (Msg, Unit_Node);
          Error_Msg_File_1 := Fname;
-         Error_Msg_N ("remove incorrect body in file{!", Main_Unit_Node);
+         Error_Msg_N ("remove incorrect body in file{!", Unit_Node);
       end Bad_Body_Error;
 
+      --  Local variables
+
+      Sname   : Unit_Name_Type;
+      Src_Ind : Source_File_Index;
+
    --  Start of processing for Check_Bad_Body
 
    begin
@@ -743,13 +738,13 @@ procedure Gnat1drv is
 
       --  Check for body not allowed
 
-      if (Main_Kind = N_Package_Declaration
-           and then not Body_Required (Main_Unit_Node))
-        or else (Main_Kind = N_Generic_Package_Declaration
-                  and then not Body_Required (Main_Unit_Node))
-        or else Main_Kind = N_Package_Renaming_Declaration
-        or else Main_Kind = N_Subprogram_Renaming_Declaration
-        or else Nkind (Original_Node (Unit (Main_Unit_Node)))
+      if (Unit_Kind = N_Package_Declaration
+           and then not Body_Required (Unit_Node))
+        or else (Unit_Kind = N_Generic_Package_Declaration
+                  and then not Body_Required (Unit_Node))
+        or else Unit_Kind = N_Package_Renaming_Declaration
+        or else Unit_Kind = N_Subprogram_Renaming_Declaration
+        or else Nkind (Original_Node (Unit (Unit_Node)))
                          in N_Generic_Instantiation
       then
          Sname := Unit_Name (Main_Unit);
@@ -793,16 +788,16 @@ procedure Gnat1drv is
             --  be incorrect (we may have misinterpreted a junk spec as not
             --  needing a body when it really does).
 
-            if Main_Kind = N_Package_Declaration
+            if Unit_Kind = N_Package_Declaration
               and then Ada_Version = Ada_83
               and then Operating_Mode = Generate_Code
               and then Distribution_Stub_Mode /= Generate_Caller_Stub_Body
               and then not Compilation_Errors
             then
                Error_Msg_N
-                 ("package $$ does not require a body??", Main_Unit_Node);
+                 ("package $$ does not require a body??", Unit_Node);
                Error_Msg_File_1 := Fname;
-               Error_Msg_N ("body in file{ will be ignored??", Main_Unit_Node);
+               Error_Msg_N ("body in file{ will be ignored??", Unit_Node);
 
                --  Ada 95 cases of a body file present when no body is
                --  permitted. This we consider to be an error.
@@ -810,15 +805,15 @@ procedure Gnat1drv is
             else
                --  For generic instantiations, we never allow a body
 
-               if Nkind (Original_Node (Unit (Main_Unit_Node))) in
+               if Nkind (Original_Node (Unit (Unit_Node))) in
                                                     N_Generic_Instantiation
                then
                   Bad_Body_Error
                     ("generic instantiation for $$ does not allow a body");
 
-                  --  A library unit that is a renaming never allows a body
+               --  A library unit that is a renaming never allows a body
 
-               elsif Main_Kind in N_Renaming_Declaration then
+               elsif Unit_Kind in N_Renaming_Declaration then
                   Bad_Body_Error
                     ("renaming declaration for $$ does not allow a body!");
 
@@ -829,11 +824,11 @@ procedure Gnat1drv is
                   --  body when in fact it does.
 
                elsif not Compilation_Errors then
-                  if Main_Kind = N_Package_Declaration then
+                  if Unit_Kind = N_Package_Declaration then
                      Bad_Body_Error
                        ("package $$ does not allow a body!");
 
-                  elsif Main_Kind = N_Generic_Package_Declaration then
+                  elsif Unit_Kind = N_Generic_Package_Declaration then
                      Bad_Body_Error
                        ("generic package $$ does not allow a body!");
                   end if;
@@ -893,9 +888,18 @@ procedure Gnat1drv is
       if AAMP_On_Target then
          Sem_Ch13.Validate_Independence;
       end if;
-
    end Post_Compilation_Validation_Checks;
 
+   --  Local variables
+
+   Back_End_Mode : Back_End.Back_End_Mode_Type;
+
+   Main_Unit_Kind : Node_Kind;
+   --  Kind of main compilation unit node
+
+   Main_Unit_Node : Node_Id;
+   --  Compilation unit node for main unit
+
 --  Start of processing for Gnat1drv
 
 begin
@@ -1065,8 +1069,9 @@ begin
       end if;
 
       Main_Unit_Node := Cunit (Main_Unit);
-      Main_Kind := Nkind (Unit (Main_Unit_Node));
-      Check_Bad_Body;
+      Main_Unit_Kind := Nkind (Unit (Main_Unit_Node));
+
+      Check_Bad_Body (Main_Unit_Node, Main_Unit_Kind);
 
       --  In CodePeer mode we always delete old SCIL files before regenerating
       --  new ones, in case of e.g. errors, and also to remove obsolete scilx
@@ -1159,21 +1164,23 @@ begin
       --  subunits. Note that we always generate code for all generic units (a
       --  change from some previous versions of GNAT).
 
-      elsif Main_Kind = N_Subprogram_Body and then not Subunits_Missing then
+      elsif Main_Unit_Kind = N_Subprogram_Body
+        and then not Subunits_Missing
+      then
          Back_End_Mode := Generate_Object;
 
       --  We can generate code for a package body unless there are subunits
       --  missing (note that we always generate code for generic units, which
       --  is a change from some earlier versions of GNAT).
 
-      elsif Main_Kind = N_Package_Body and then not Subunits_Missing then
+      elsif Main_Unit_Kind = N_Package_Body and then not Subunits_Missing then
          Back_End_Mode := Generate_Object;
 
       --  We can generate code for a package declaration or a subprogram
       --  declaration only if it does not required a body.
 
-      elsif Nkind_In (Main_Kind, N_Package_Declaration,
-                                 N_Subprogram_Declaration)
+      elsif Nkind_In (Main_Unit_Kind, N_Package_Declaration,
+                                      N_Subprogram_Declaration)
         and then
           (not Body_Required (Main_Unit_Node)
              or else Distribution_Stub_Mode = Generate_Caller_Stub_Body)
@@ -1183,8 +1190,8 @@ begin
       --  We can generate code for a generic package declaration of a generic
       --  subprogram declaration only if does not require a body.
 
-      elsif Nkind_In (Main_Kind, N_Generic_Package_Declaration,
-                                 N_Generic_Subprogram_Declaration)
+      elsif Nkind_In (Main_Unit_Kind, N_Generic_Package_Declaration,
+                                      N_Generic_Subprogram_Declaration)
         and then not Body_Required (Main_Unit_Node)
       then
          Back_End_Mode := Generate_Object;
@@ -1192,15 +1199,15 @@ begin
       --  Compilation units that are renamings do not require bodies, so we can
       --  generate code for them.
 
-      elsif Nkind_In (Main_Kind, N_Package_Renaming_Declaration,
-                                 N_Subprogram_Renaming_Declaration)
+      elsif Nkind_In (Main_Unit_Kind, N_Package_Renaming_Declaration,
+                                      N_Subprogram_Renaming_Declaration)
       then
          Back_End_Mode := Generate_Object;
 
       --  Compilation units that are generic renamings do not require bodies
       --  so we can generate code for them.
 
-      elsif Main_Kind in N_Generic_Renaming_Declaration then
+      elsif Main_Unit_Kind in N_Generic_Renaming_Declaration then
          Back_End_Mode := Generate_Object;
 
       --  It is not an error to analyze in CodePeer mode a spec which requires
@@ -1240,45 +1247,61 @@ begin
       --  generate code).
 
       if Back_End_Mode = Skip then
-         Set_Standard_Error;
-         Write_Str ("cannot generate code for file ");
-         Write_Name (Unit_File_Name (Main_Unit));
 
-         if Subunits_Missing then
-            Write_Str (" (missing subunits)");
-            Write_Eol;
+         --  An ignored Ghost unit is rewritten into a null statement because
+         --  it must not produce an ALI or object file. Do not emit any errors
+         --  related to code generation because the unit does not exist.
 
-            --  Force generation of ALI file, for backward compatibility
+         if Main_Unit_Kind = N_Null_Statement
+           and then Is_Ignored_Ghost_Node
+                      (Original_Node (Unit (Main_Unit_Node)))
+         then
+            null;
 
-            Opt.Force_ALI_Tree_File := True;
+         --  Otherwise the unit is missing a crucial piece that prevents code
+         --  generation.
 
-         elsif Main_Kind = N_Subunit then
-            Write_Str (" (subunit)");
-            Write_Eol;
+         else
+            Set_Standard_Error;
+            Write_Str ("cannot generate code for file ");
+            Write_Name (Unit_File_Name (Main_Unit));
 
-            --  Force generation of ALI file, for backward compatibility
+            if Subunits_Missing then
+               Write_Str (" (missing subunits)");
+               Write_Eol;
 
-            Opt.Force_ALI_Tree_File := True;
+               --  Force generation of ALI file, for backward compatibility
 
-         elsif Main_Kind = N_Subprogram_Declaration then
-            Write_Str (" (subprogram spec)");
-            Write_Eol;
+               Opt.Force_ALI_Tree_File := True;
 
-         --  Generic package body in GNAT implementation mode
+            elsif Main_Unit_Kind = N_Subunit then
+               Write_Str (" (subunit)");
+               Write_Eol;
 
-         elsif Main_Kind = N_Package_Body and then GNAT_Mode then
-            Write_Str (" (predefined generic)");
-            Write_Eol;
+               --  Force generation of ALI file, for backward compatibility
 
-            --  Force generation of ALI file, for backward compatibility
+               Opt.Force_ALI_Tree_File := True;
 
-            Opt.Force_ALI_Tree_File := True;
+            elsif Main_Unit_Kind = N_Subprogram_Declaration then
+               Write_Str (" (subprogram spec)");
+               Write_Eol;
 
-         --  Only other case is a package spec
+            --  Generic package body in GNAT implementation mode
 
-         else
-            Write_Str (" (package spec)");
-            Write_Eol;
+            elsif Main_Unit_Kind = N_Package_Body and then GNAT_Mode then
+               Write_Str (" (predefined generic)");
+               Write_Eol;
+
+               --  Force generation of ALI file, for backward compatibility
+
+               Opt.Force_ALI_Tree_File := True;
+
+            --  Only other case is a package spec
+
+            else
+               Write_Str (" (package spec)");
+               Write_Eol;
+            end if;
          end if;
 
          Set_Standard_Output;
@@ -1320,7 +1343,7 @@ begin
       if Back_End_Mode = Declarations_Only
         and then
           (not (Back_Annotate_Rep_Info or Generate_SCIL or GNATprove_Mode)
-            or else Main_Kind = N_Subunit
+            or else Main_Unit_Kind = N_Subunit
             or else Frontend_Layout_On_Target
             or else ASIS_GNSA_Mode)
       then
@@ -1465,11 +1488,10 @@ begin
       when Program_Error =>
          Comperr.Compiler_Abort ("Program_Error");
 
-      when Storage_Error =>
-
-         --  Assume this is a bug. If it is real, the message will in any case
-         --  say Storage_Error, giving a strong hint.
+      --  Assume this is a bug. If it is real, the message will in any case
+      --  say Storage_Error, giving a strong hint.
 
+      when Storage_Error =>
          Comperr.Compiler_Abort ("Storage_Error");
 
       when Unrecoverable_Error =>
@@ -1482,7 +1504,7 @@ begin
    <<End_Of_Program>>
    null;
 
-   --  The outer exception handles an unrecoverable error
+--  The outer exception handler handles an unrecoverable error
 
 exception
    when Unrecoverable_Error =>
index c4edc7f1ebbf5240a5400e28d6e0d08ab40635ca..0ba9f9ad245d28de0e192070fb3c2ffe722b90c0 100644 (file)
@@ -445,7 +445,14 @@ package body Lib is
          --  Prevent looping forever
 
          if Counter > Max_Iterations then
-            raise Program_Error;
+            --  ??? Not quite right, but return a value to be able to generate
+            --  SCIL files and hope for the best.
+
+            if CodePeer_Mode then
+               return No;
+            else
+               raise Program_Error;
+            end if;
          end if;
       end loop;
    end Check_Same_Extended_Unit;
index d79a8453adaf437bb952c8a5534c4705e98611b3..aecf7d4355d27f745483792885477b2056a1e1ae 100644 (file)
@@ -14879,8 +14879,8 @@ package body Sem_Ch12 is
                     and then Is_Global (Entity (Orig_N2_Parent))
                   then
                      N2 := Aux_N2;
-                     Set_Associated_Node (Parent (N),
-                       Original_Node (Parent (N2)));
+                     Set_Associated_Node
+                       (Parent (N), Original_Node (Parent (N2)));
 
                   --  Common case
 
index aad9f68fe96bdfdd8bc574b3f391d726a7e48627..89a17c8755f0ed6623b5b183f7a3fbfeee4a6a4c 100644 (file)
@@ -6618,7 +6618,13 @@ package body Sem_Ch13 is
    -----------------------------------
 
    procedure Analyze_Freeze_Generic_Entity (N : Node_Id) is
+      E : constant Entity_Id := Entity (N);
+
    begin
+      if not Is_Frozen (E) and then Has_Delayed_Aspects (E) then
+         Analyze_Aspects_At_Freeze_Point (E);
+      end if;
+
       Freeze_Entity_Checks (N);
    end Analyze_Freeze_Generic_Entity;
 
@@ -10789,20 +10795,10 @@ package body Sem_Ch13 is
       --  the subtype name in the saved expression so that they will not cause
       --  trouble in the preanalysis.
 
-      --  Case 1: Generic case. For freezing nodes of types defined in generics
-      --  we must perform the analysis of its aspects; needed to ensure that
-      --  they have the minimum decoration needed by ASIS.
-
-      if not Non_Generic_Case then
-         if Has_Delayed_Aspects (E) then
-            Push_Scope (Scope (E));
-            Analyze_Aspects_At_Freeze_Point (E);
-            Pop_Scope;
-         end if;
-
-      --  Case 2: Non-generic case
+      --  This is also not needed in the generic case
 
-      elsif Has_Delayed_Aspects (E)
+      if Non_Generic_Case
+        and then Has_Delayed_Aspects (E)
         and then Scope (E) = Current_Scope
       then
          --  Retrieve the visibility to the discriminants in order to properly
index 5bbc1a34d17e93a3d6d302d5a3ee2413de9658f8..45ad8d63a1166d0aa5d0a65788aac0a9ab037936 100644 (file)
@@ -3495,11 +3495,11 @@ package body Sem_Ch4 is
                --      generic
                --         type Inner_T is private;
                --         with function Func (Formal : Inner_T)   --  (1)
-               --                            return ... is <>;
+               --           return ... is <>;
 
                --      package Inner_Gen is
                --         function Inner_Func (Formal : Inner_T)  --  (2)
-               --                             return ... is (Func (Formal));
+               --           return ... is (Func (Formal));
                --      end Inner_Gen;
                --   end Outer_Generic;
 
@@ -3509,15 +3509,15 @@ package body Sem_Ch4 is
                --  In the example above, the type of parameter
                --  Inner_Func.Formal at (2) is incompatible with the type of
                --  Func.Formal at (1) in the context of instantiations
-               --  Outer_Inst and Inner_Inst. In reality both types are
-               --  generic actual subtypes renaming base type Actual_T as
-               --  part of the generic prologues for the instantiations.
-
-               --  Recognize this case and add a type conversion to allow
-               --  this kind of generic actual subtype conformance. Note that
-               --  this is done only when the call is non-overloaded because
-               --  the resolution mechanism already has the means to
-               --  disambiguate similar cases.
+               --  Outer_Inst and Inner_Inst. In reality both types are generic
+               --  actual subtypes renaming base type Actual_T as part of the
+               --  generic prologues for the instantiations.
+
+               --  Recognize this case and add a type conversion to allow this
+               --  kind of generic actual subtype conformance. Note that this
+               --  is done only when the call is non-overloaded because the
+               --  resolution mechanism already has the means to disambiguate
+               --  similar cases.
 
                elsif not Is_Overloaded (Name (N))
                  and then Is_Type (Etype (Actual))
index a91d62e5ce91c71fab20232c9cb1f89da22c389e..86083eb69550eca993da3603053b7e3bd4ed4d15 100644 (file)
@@ -2143,17 +2143,18 @@ package body Sem_Ch6 is
    --  the subprogram, or to perform conformance checks.
 
    procedure Analyze_Subprogram_Body_Helper (N : Node_Id) is
-      Loc          : constant Source_Ptr := Sloc (N);
-      Body_Spec    : Node_Id             := Specification (N);
-      Body_Id      : Entity_Id           := Defining_Entity (Body_Spec);
-      Prev_Id      : constant Entity_Id  := Current_Entity_In_Scope (Body_Id);
-      Exch_Views   : Elist_Id            := No_Elist;
-      Desig_View   : Entity_Id           := Empty;
-      Conformant   : Boolean;
-      HSS          : Node_Id;
-      Prot_Typ     : Entity_Id := Empty;
-      Spec_Id      : Entity_Id;
-      Spec_Decl    : Node_Id   := Empty;
+      Body_Spec : Node_Id             := Specification (N);
+      Body_Id   : Entity_Id           := Defining_Entity (Body_Spec);
+      Loc       : constant Source_Ptr := Sloc (N);
+      Prev_Id   : constant Entity_Id  := Current_Entity_In_Scope (Body_Id);
+
+      Conformant : Boolean;
+      Desig_View : Entity_Id := Empty;
+      Exch_Views : Elist_Id  := No_Elist;
+      HSS        : Node_Id;
+      Prot_Typ   : Entity_Id := Empty;
+      Spec_Decl  : Node_Id   := Empty;
+      Spec_Id    : Entity_Id;
 
       Last_Real_Spec_Entity : Entity_Id := Empty;
       --  When we analyze a separate spec, the entity chain ends up containing
index 6ce93639b89a8376e9a684017a3cdf2d3402e4e6..314c110fb8d86311343175dc88b8a47f1dbd56a9 100644 (file)
@@ -445,11 +445,24 @@ package body Sem_Eval is
       --  that an infinity will result.
 
       if not Is_Static_Expression (N) then
-         if Is_Floating_Point_Type (T)
-           and then Is_Out_Of_Range (N, Base_Type (T), Assume_Valid => True)
-         then
-            Error_Msg_N
-              ("??float value out of range, infinity will be generated", N);
+         if Is_Floating_Point_Type (T) then
+            if Is_Out_Of_Range (N, Base_Type (T), Assume_Valid => True) then
+               Error_Msg_N
+                 ("??float value out of range, infinity will be generated", N);
+
+            --  The literal may be the result of constant-folding of a non-
+            --  static subexpression of a larger expression (e.g. a conversion
+            --  of a non-static variable whose value happens to be known). At
+            --  this point we must reduce the value of the subexpression to a
+            --  machine number (RM 4.9 (38/2)).
+
+            elsif Nkind (N) = N_Real_Literal
+              and then Nkind (Parent (N)) in N_Subexpr
+            then
+               Rewrite (N, New_Copy (N));
+               Set_Realval
+                 (N, Machine (Base_Type (T), Realval (N), Round_Even, N));
+            end if;
          end if;
 
          return;
index e26443aa980974acd0a49f3a1746d5f7f4eb4f33..c038dc4d799c0e30afc1b8ce6d0b5597febd309f 100644 (file)
@@ -62,11 +62,14 @@ package body Sem_Intr is
    --  as for Check_Intrinsic_Subprogram (i.e. the entity of the subprogram
    --  declaration, and the node for the pragma argument, used for messages).
 
-   procedure Errint (Msg : String; S : Node_Id; N : Node_Id);
+   procedure Errint
+     (Msg : String; S : Node_Id; N : Node_Id; Relaxed : Boolean := False);
    --  Post error message for bad intrinsic, the message itself is posted
    --  on the appropriate spec node and another message is placed on the
    --  pragma itself, referring to the spec. S is the node in the spec on
    --  which the message is to be placed, and N is the pragma argument node.
+   --  Relaxed is True if the message should not be emitted in
+   --  Relaxed_RM_Semantics mode.
 
    ------------------------------
    -- Check_Exception_Function --
@@ -432,7 +435,7 @@ package body Sem_Intr is
       then
          Errint
            ("first argument for shift must have size 8, 16, 32 or 64",
-            Ptyp1, N);
+            Ptyp1, N, Relaxed => True);
          return;
 
       elsif Non_Binary_Modulus (Typ1) then
@@ -450,7 +453,7 @@ package body Sem_Intr is
       then
          Errint
            ("modular type for shift must have modulus of 2'*'*8, "
-            & "2'*'*16, 2'*'*32, or 2'*'*64", Ptyp1, N);
+            & "2'*'*16, 2'*'*32, or 2'*'*64", Ptyp1, N, Relaxed => True);
 
       elsif Etype (Arg1) /= Etype (E) then
          Errint
@@ -465,12 +468,13 @@ package body Sem_Intr is
    -- Errint --
    ------------
 
-   procedure Errint (Msg : String; S : Node_Id; N : Node_Id) is
+   procedure Errint
+     (Msg : String; S : Node_Id; N : Node_Id; Relaxed : Boolean := False) is
    begin
       --  Ignore errors on Intrinsic in Relaxed_RM_Semantics mode where we can
       --  be more liberal.
 
-      if not Relaxed_RM_Semantics then
+      if not (Relaxed and Relaxed_RM_Semantics) then
          Error_Msg_N (Msg, S);
          Error_Msg_N ("incorrect intrinsic subprogram, see spec", N);
       end if;
index f603e317af479a20c59b10405a1365ec2ffcd479..3b9d9841f47a0c0622cbaa2e18a3378b543d2aa3 100644 (file)
@@ -9080,6 +9080,14 @@ package body Sem_Prag is
                   Ghost_Id := Subp;
                end if;
 
+            --  Do not issue an error on an unanalyzed subprogram body entity.
+            --  It may lead to spurious errors on unanalyzed body entities of
+            --  expression functions, which are not yet marked as ghost, yet
+            --  identified as the Corresponding_Body of the ghost declaration.
+
+            elsif Ekind (Subp) = E_Void then
+               null;
+
             --  Otherwise the subprogram is non-Ghost. It is illegal to mix
             --  references to Ghost and non-Ghost entities (SPARK RM 6.9).
 
index fd6421cad579624e0d88e4a61a7d86112358ca53..e8a22fa64e1ac52049355d10a0742bc1993111f3 100644 (file)
@@ -11500,7 +11500,7 @@ package body Sem_Util is
    ------------------------------------------
 
    procedure Inspect_Deferred_Constant_Completion (Decls : List_Id) is
-      Decl   : Node_Id;
+      Decl : Node_Id;
 
    begin
       Decl := First (Decls);
index cb0a09293aa773edc711e38f045c16c1a808ee6a..d9050959ff2427f1689a27de6b94e9058719622c 100644 (file)
@@ -314,6 +314,11 @@ package body Sem_Warn is
             elsif Is_Suspicious_Function_Name (Entity (Name (N))) then
                return;
 
+            --  Forget it if function is marked Volatile_Function
+
+            elsif Is_Volatile_Function (Entity (Name (N))) then
+               return;
+
             --  Forget it if warnings are suppressed on function entity
 
             elsif Has_Warnings_Off (Entity (Name (N))) then