[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 27 Apr 2017 13:38:28 +0000 (15:38 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 27 Apr 2017 13:38:28 +0000 (15:38 +0200)
2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>

* sem_eval.adb (Subtypes_Statically_Compatible): Remove duplicated
check.
(Subtypes_Statically_Match): Remove duplicate check.
* sem_prag.adb (Check_Arg_Is_External_Name): Remove duplicate check.

2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>

* exp_aggr.adb (Replace_Type): Remove the special processing
for selected components.
* exp_attr.adb (Expand_N_Attribute_Reference): Merge the
processing for attributes Fixed_Value and Integer_Value.
* exp_util.adb (Side_Effect_Free): Merge the processing for
qualified expressions, type conversions, and unchecked type
conversions.
* g-comlin.adb (Is_In_Config): Merge the processing for No_Space
and Optional.
* par-ch3.adb (P_Declarative_Items): Merge the processing for
tokens function, not, overriding, and procedure.
* sem_ch6.adb (Fully_Conformant_Expressions): Merge the processing
for qualified expressions, type conversions, and unchecked
type conversions.
* sem_util.adb (Compile_Time_Constraint_Error): Merge the
processing for Ada 83 and instances.
(Object_Access_Level): Merge the processing for indexed components
and selected components.
* uname.adb (Add_Node_Name): Merge the processing for stubs.

2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>

* checks.adb (Install_Primitive_Elaboration_Check):
Do not generate the check when restriction No_Elaboration_Code
is in effect.

2017-04-27  Ed Schonberg  <schonberg@adacore.com>

* exp_disp.adb (Build_Class_Wide_Check): New subsidiary
of Expand_Dispatching_Call. If the denoted subprogram has a
class-wide precondition, this is the only precondition that
applies to the call, rather that the class-wide preconditions
that may apply to the body that is executed. (This is specified
in AI12-0195).

From-SVN: r247333

13 files changed:
gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/exp_aggr.adb
gcc/ada/exp_attr.adb
gcc/ada/exp_disp.adb
gcc/ada/exp_util.adb
gcc/ada/g-comlin.adb
gcc/ada/par-ch3.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_eval.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_util.adb
gcc/ada/uname.adb

index 7c4293d27c605db0be3b6e75d3f4386c34b4b622..1be7e3e06dd99f044024eef9603bc80feb579291 100644 (file)
@@ -1,3 +1,47 @@
+2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * sem_eval.adb (Subtypes_Statically_Compatible): Remove duplicated
+       check.
+       (Subtypes_Statically_Match): Remove duplicate check.
+       * sem_prag.adb (Check_Arg_Is_External_Name): Remove duplicate check.
+
+2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * exp_aggr.adb (Replace_Type): Remove the special processing
+       for selected components.
+       * exp_attr.adb (Expand_N_Attribute_Reference): Merge the
+       processing for attributes Fixed_Value and Integer_Value.
+       * exp_util.adb (Side_Effect_Free): Merge the processing for
+       qualified expressions, type conversions, and unchecked type
+       conversions.
+       * g-comlin.adb (Is_In_Config): Merge the processing for No_Space
+       and Optional.
+       * par-ch3.adb (P_Declarative_Items): Merge the processing for
+       tokens function, not, overriding, and procedure.
+       * sem_ch6.adb (Fully_Conformant_Expressions): Merge the processing
+       for qualified expressions, type conversions, and unchecked
+       type conversions.
+       * sem_util.adb (Compile_Time_Constraint_Error): Merge the
+       processing for Ada 83 and instances.
+       (Object_Access_Level): Merge the processing for indexed components
+       and selected components.
+       * uname.adb (Add_Node_Name): Merge the processing for stubs.
+
+2017-04-27  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * checks.adb (Install_Primitive_Elaboration_Check):
+       Do not generate the check when restriction No_Elaboration_Code
+       is in effect.
+
+2017-04-27  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_disp.adb (Build_Class_Wide_Check): New subsidiary
+       of Expand_Dispatching_Call. If the denoted subprogram has a
+       class-wide precondition, this is the only precondition that
+       applies to the call, rather that the class-wide preconditions
+       that may apply to the body that is executed. (This is specified
+       in AI12-0195).
+
 2017-04-27  Yannick Moy  <moy@adacore.com>
 
        * gnat1drv.adb (Adjust_Global_Switches): Issue
index d9a36df32a99c2631ac7723f1fdbff25b64e56f3..fa55615db7f30dda17eda5e57b5436ee2c5b292a 100644 (file)
@@ -7740,7 +7740,6 @@ package body Checks is
    -----------------------------------------
 
    procedure Install_Primitive_Elaboration_Check (Subp_Body : Node_Id) is
-
       function Within_Compilation_Unit_Instance
         (Subp_Id : Entity_Id) return Boolean;
       --  Determine whether subprogram Subp_Id appears within an instance which
@@ -7796,6 +7795,11 @@ package body Checks is
       if ASIS_Mode or GNATprove_Mode then
          return;
 
+      --  Do not generate an elaboration check if such code is not desirable
+
+      elsif Restriction_Active (No_Elaboration_Code) then
+         return;
+
       --  Do not generate an elaboration check if the related subprogram is
       --  not subjected to accessibility checks.
 
index 685edaafa7244a93643cd2829f4b0ffade7f15b7..0cbbd01875d38387c659fe9a8fd40f23ed6f772b 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2017, 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- --
@@ -3042,15 +3042,7 @@ package body Exp_Aggr is
            and then Root_Type (Etype (N)) = Root_Type (Entity (Prefix (Expr)))
          then
             if Is_Entity_Name (Lhs) then
-               Rewrite (Prefix (Expr),
-                 New_Occurrence_Of (Entity (Lhs), Loc));
-
-            elsif Nkind (Lhs) = N_Selected_Component then
-               Rewrite (Expr,
-                 Make_Attribute_Reference (Loc,
-                   Attribute_Name => Name_Unrestricted_Access,
-                   Prefix         => New_Copy_Tree (Lhs)));
-               Set_Analyzed (Parent (Expr), False);
+               Rewrite (Prefix (Expr), New_Occurrence_Of (Entity (Lhs), Loc));
 
             else
                Rewrite (Expr,
index ad6ab41cc7302bf8e0ecb504493774f55486a8dc..21a17716acaff35d527b472e08aa1a44a4cf042e 100644 (file)
@@ -3360,24 +3360,30 @@ package body Exp_Attr is
          end if;
       end First_Bit_Attr;
 
-      -----------------
-      -- Fixed_Value --
-      -----------------
+      --------------------------------
+      -- Fixed_Value, Integer_Value --
+      --------------------------------
 
-      --  We transform:
+      --  We transform
 
       --     fixtype'Fixed_Value (integer-value)
+      --     inttype'Fixed_Value (fixed-value)
 
       --  into
 
-      --     fixtype(integer-value)
+      --     fixtype (integer-value)
+      --     inttype (fixed-value)
+
+      --  respectively.
 
       --  We do all the required analysis of the conversion here, because we do
       --  not want this to go through the fixed-point conversion circuits. Note
       --  that the back end always treats fixed-point as equivalent to the
       --  corresponding integer type anyway.
 
-      when Attribute_Fixed_Value =>
+      when Attribute_Fixed_Value
+         | Attribute_Integer_Value
+      =>
          Rewrite (N,
            Make_Type_Conversion (Loc,
              Subtype_Mark => New_Occurrence_Of (Entity (Pref), Loc),
@@ -3923,37 +3929,6 @@ package body Exp_Attr is
          end if;
       end Input;
 
-      -------------------
-      -- Integer_Value --
-      -------------------
-
-      --  We transform
-
-      --    inttype'Fixed_Value (fixed-value)
-
-      --  into
-
-      --    inttype(integer-value))
-
-      --  we do all the required analysis of the conversion here, because we do
-      --  not want this to go through the fixed-point conversion circuits. Note
-      --  that the back end always treats fixed-point as equivalent to the
-      --  corresponding integer type anyway.
-
-      when Attribute_Integer_Value =>
-         Rewrite (N,
-           Make_Type_Conversion (Loc,
-             Subtype_Mark => New_Occurrence_Of (Entity (Pref), Loc),
-             Expression   => Relocate_Node (First (Exprs))));
-         Set_Etype (N, Entity (Pref));
-         Set_Analyzed (N);
-
-         --  Note: it might appear that a properly analyzed unchecked
-         --  conversion would be just fine here, but that's not the case, since
-         --  the full range check performed by the following call is critical.
-
-         Apply_Type_Conversion_Checks (N);
-
       -------------------
       -- Invalid_Value --
       -------------------
index 0a6a03b7fd5f6b594a2d7abcac518c92484bd38a..d1822c4df466e9f082f96ae07f6b1c7c8cd9ede9 100644 (file)
@@ -58,6 +58,7 @@ with Sem_Res;  use Sem_Res;
 with Sem_Type; use Sem_Type;
 with Sem_Util; use Sem_Util;
 with Sinfo;    use Sinfo;
+with Sinput;   use Sinput;
 with Snames;   use Snames;
 with Stand;    use Stand;
 with Stringt;  use Stringt;
@@ -649,11 +650,112 @@ package body Exp_Disp is
       Eq_Prim_Op      : Entity_Id := Empty;
       Controlling_Tag : Node_Id;
 
+      procedure Build_Class_Wide_Check;
+      --  If the denoted subprogram has a class-wide precondition, generate
+      --  a check using that precondition before the dispatching call, because
+      --  this is the only class-wide precondition that applies to the call.
+
       function New_Value (From : Node_Id) return Node_Id;
       --  From is the original Expression. New_Value is equivalent to a call
       --  to Duplicate_Subexpr with an explicit dereference when From is an
       --  access parameter.
 
+      ----------------------------
+      -- Build_Class_Wide_Check --
+      ----------------------------
+
+      procedure Build_Class_Wide_Check is
+         Prec    : Node_Id;
+         Cond    : Node_Id;
+         Msg     : Node_Id;
+         Str_Loc : constant String := Build_Location_String (Loc);
+
+         function Replace_Formals (N : Node_Id) return Traverse_Result;
+         --  Replace occurrences of the formals of the subprogram by the
+         --  corresponding actuals in the call, given that this check is
+         --  performed outside of the body of the subprogram.
+
+         ---------------------
+         -- Replace_Formals --
+         ---------------------
+
+         function Replace_Formals (N : Node_Id) return Traverse_Result is
+         begin
+            if Is_Entity_Name (N)
+              and then Present (Entity (N))
+              and then Is_Formal (Entity (N))
+            then
+               declare
+                  A : Node_Id;
+                  F : Entity_Id;
+
+               begin
+                  F := First_Formal (Subp);
+                  A := First_Actual (Call_Node);
+                  while Present (F) loop
+                     if F = Entity (N) then
+                        Rewrite (N, New_Copy_Tree (A));
+                        exit;
+                     end if;
+                     Next_Formal (F);
+                     Next_Actual (A);
+                  end loop;
+               end;
+            end if;
+
+            return OK;
+         end Replace_Formals;
+
+         procedure Update is new Traverse_Proc (Replace_Formals);
+      begin
+
+         --  Locate class-wide precondition, if any
+
+         if Present (Contract (Subp))
+           and then Present (Pre_Post_Conditions (Contract (Subp)))
+         then
+            Prec := Pre_Post_Conditions (Contract (Subp));
+
+            while Present (Prec) loop
+               exit when Pragma_Name (Prec) = Name_Precondition
+                 and then Class_Present (Prec);
+               Prec := Next_Pragma (Prec);
+            end loop;
+
+            if No (Prec) then
+               return;
+            end if;
+
+            --  The expression for the precondition is analyzed within the
+            --  generated pragma. The message text is the last parameter
+            --  of the generated pragma, indicating source of precondition.
+
+            Cond := New_Copy_Tree
+              (Expression (First (Pragma_Argument_Associations (Prec))));
+            Update (Cond);
+
+            --  Build message indicating the failed precondition and the
+            --  dispatching call that caused it.
+
+            Msg := Expression (Last (Pragma_Argument_Associations (Prec)));
+            Name_Len := 0;
+            Append (Global_Name_Buffer, Strval (Msg));
+            Append (Global_Name_Buffer, " in dispatching call at ");
+            Append (Global_Name_Buffer, Str_Loc);
+            Msg := Make_String_Literal (Loc, Name_Buffer (1 .. Name_Len));
+
+            Insert_Action (Call_Node,
+               Make_If_Statement (Loc,
+                  Condition => Make_Op_Not (Loc, Cond),
+                  Then_Statements => New_List (
+                     Make_Procedure_Call_Statement (Loc,
+                       Name                   =>
+                         New_Occurrence_Of
+                           (RTE (RE_Raise_Assert_Failure), Loc),
+                       Parameter_Associations => New_List (Msg)))));
+         end if;
+      end Build_Class_Wide_Check;
+
       ---------------
       -- New_Value --
       ---------------
@@ -714,6 +816,8 @@ package body Exp_Disp is
          Subp := Alias (Subp);
       end if;
 
+      Build_Class_Wide_Check;
+
       --  Definition of the class-wide type and the tagged type
 
       --  If the controlling argument is itself a tag rather than a tagged
@@ -1174,7 +1278,7 @@ package body Exp_Disp is
       if not Tagged_Type_Expansion then
          return;
 
-      --  A static conversion to an interface type that is not classwide is
+      --  A static conversion to an interface type that is not class-wide is
       --  curious but legal if the interface operation is a null procedure.
       --  If the operation is abstract it will be rejected later.
 
@@ -1190,7 +1294,7 @@ package body Exp_Disp is
 
       if not Is_Static then
 
-         --  Give error if configurable run time and Displace not available
+         --  Give error if configurable run-time and Displace not available
 
          if not RTE_Available (RE_Displace) then
             Error_Msg_CRT ("dynamic interface conversion", N);
index 2c23841f465c5968af08bad4e495ffd3b748b7b5..0c87e1f9739dc64c202344f5b4339ba17338fc69 100644 (file)
@@ -12942,10 +12942,13 @@ package body Exp_Util is
               Side_Effect_Free (Expressions (N), Name_Req, Variable_Ref)
                 and then Safe_Prefixed_Reference (N);
 
-         --  A type qualification is side effect free if the expression
-         --  is side effect free.
+         --  A type qualification, type conversion, or unchecked expression is
+         --  side effect free if the expression is side effect free.
 
-         when N_Qualified_Expression =>
+         when N_Qualified_Expression
+            | N_Type_Conversion
+            | N_Unchecked_Expression
+         =>
             return Side_Effect_Free (Expression (N), Name_Req, Variable_Ref);
 
          --  A selected component is side effect free only if it is a side
@@ -12969,12 +12972,6 @@ package body Exp_Util is
                Side_Effect_Free (Discrete_Range (N), Name_Req, Variable_Ref)
                  and then Safe_Prefixed_Reference (N);
 
-         --  A type conversion is side effect free if the expression to be
-         --  converted is side effect free.
-
-         when N_Type_Conversion =>
-            return Side_Effect_Free (Expression (N), Name_Req, Variable_Ref);
-
          --  A unary operator is side effect free if the operand
          --  is side effect free.
 
@@ -12990,12 +12987,6 @@ package body Exp_Util is
                 and then Side_Effect_Free
                            (Expression (N), Name_Req, Variable_Ref);
 
-         --  An unchecked expression is side effect free if its expression
-         --  is side effect free.
-
-         when N_Unchecked_Expression =>
-            return Side_Effect_Free (Expression (N), Name_Req, Variable_Ref);
-
          --  A literal is side effect free
 
          when N_Character_Literal
index ef76fee3f68f490496c06b23c345ce8825234c6a..978040ea78da0de0425f2bd46c54fad416dfee1f 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1999-2016, Free Software Foundation, Inc.         --
+--          Copyright (C) 1999-2017, 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- --
@@ -2002,12 +2002,9 @@ package body GNAT.Command_Line is
                   Found_In_Config := True;
                   return False;
 
-               when Parameter_No_Space =>
-                  Callback (Switch, "", Parameter, Index);
-                  Found_In_Config := True;
-                  return False;
-
-               when Parameter_Optional =>
+               when Parameter_No_Space
+                  | Parameter_Optional
+               =>
                   Callback (Switch, "", Parameter, Index);
                   Found_In_Config := True;
                   return False;
index 5c846645e9d00679730775bb3b063b68d43f11a3..529c501f26dba27c5a79b231d0a75698ce6573be 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2017, 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- --
@@ -4319,7 +4319,11 @@ package body Ch3 is
       end if;
 
       case Token is
-         when Tok_Function =>
+         when Tok_Function
+            | Tok_Not
+            | Tok_Overriding
+            | Tok_Procedure
+         =>
             Check_Bad_Layout;
             Append (P_Subprogram (Pf_Decl_Gins_Pbod_Rnam_Stub_Pexp), Decls);
             Done := False;
@@ -4374,20 +4378,6 @@ package body Ch3 is
                P_Identifier_Declarations (Decls, Done, In_Spec);
             end if;
 
-         --  Ada 2005: A subprogram declaration can start with "not" or
-         --  "overriding". In older versions, "overriding" is handled
-         --  like an identifier, with the appropriate messages.
-
-         when Tok_Not =>
-            Check_Bad_Layout;
-            Append (P_Subprogram (Pf_Decl_Gins_Pbod_Rnam_Stub_Pexp), Decls);
-            Done := False;
-
-         when Tok_Overriding =>
-            Check_Bad_Layout;
-            Append (P_Subprogram (Pf_Decl_Gins_Pbod_Rnam_Stub_Pexp), Decls);
-            Done := False;
-
          when Tok_Package =>
             Check_Bad_Layout;
             Append (P_Package (Pf_Decl_Gins_Pbod_Rnam_Stub_Pexp), Decls);
@@ -4397,11 +4387,6 @@ package body Ch3 is
             Append (P_Pragma, Decls);
             Done := False;
 
-         when Tok_Procedure =>
-            Check_Bad_Layout;
-            Append (P_Subprogram (Pf_Decl_Gins_Pbod_Rnam_Stub_Pexp), Decls);
-            Done := False;
-
          when Tok_Protected =>
             Check_Bad_Layout;
             Scan; -- past PROTECTED
index 32384d9e6199dedcd5b185db070e1406805bc514..9ba68b1ec3f84b588f3e1c98700086acbe94aa68 100644 (file)
@@ -8981,7 +8981,10 @@ package body Sem_Ch6 is
                    and then FCE (Explicit_Actual_Parameter (E1),
                                  Explicit_Actual_Parameter (E2));
 
-            when N_Qualified_Expression =>
+            when N_Qualified_Expression
+               | N_Type_Conversion
+               | N_Unchecked_Type_Conversion
+            =>
                return
                  FCE (Subtype_Mark (E1), Subtype_Mark (E2))
                    and then
@@ -9084,24 +9087,12 @@ package body Sem_Ch6 is
                   end if;
                end;
 
-            when N_Type_Conversion =>
-               return
-                 FCE (Subtype_Mark (E1), Subtype_Mark (E2))
-                   and then
-                 FCE (Expression (E1), Expression (E2));
-
             when N_Unary_Op =>
                return
                  Entity (E1) = Entity (E2)
                    and then
                  FCE (Right_Opnd (E1), Right_Opnd (E2));
 
-            when N_Unchecked_Type_Conversion =>
-               return
-                 FCE (Subtype_Mark (E1), Subtype_Mark (E2))
-                   and then
-                 FCE (Expression (E1), Expression (E2));
-
             --  All other node types cannot appear in this context. Strictly
             --  we should raise a fatal internal error. Instead we just ignore
             --  the nodes. This means that if anyone makes a mistake in the
index 24e0963c88e5fde9a64746c4ffc1535fe60b68b8..41941ba50b04214053d23703941dd7329f179365 100644 (file)
@@ -5681,14 +5681,6 @@ package body Sem_Eval is
          then
             return False;
 
-         --  If either type has constraint error bounds, then consider that
-         --  they match to avoid junk cascaded errors here.
-
-         elsif not Is_OK_Static_Subtype (T1)
-           or else not Is_OK_Static_Subtype (T2)
-         then
-            return True;
-
          --  Base types must match, but we don't check that (should we???) but
          --  we do at least check that both types are real, or both types are
          --  not real.
@@ -5708,19 +5700,17 @@ package body Sem_Eval is
             begin
                if Is_Real_Type (T1) then
                   return
-                    (Expr_Value_R (LB1) > Expr_Value_R (HB1))
+                    Expr_Value_R (LB1) > Expr_Value_R (HB1)
                       or else
-                    (Expr_Value_R (LB2) <= Expr_Value_R (LB1)
-                       and then
-                     Expr_Value_R (HB1) <= Expr_Value_R (HB2));
+                        (Expr_Value_R (LB2) <= Expr_Value_R (LB1)
+                          and then Expr_Value_R (HB1) <= Expr_Value_R (HB2));
 
                else
                   return
-                    (Expr_Value (LB1) > Expr_Value (HB1))
+                    Expr_Value (LB1) > Expr_Value (HB1)
                       or else
-                    (Expr_Value (LB2) <= Expr_Value (LB1)
-                       and then
-                     Expr_Value (HB1) <= Expr_Value (HB2));
+                        (Expr_Value (LB2) <= Expr_Value (LB1)
+                          and then Expr_Value (HB1) <= Expr_Value (HB2));
                end if;
             end;
          end if;
@@ -5728,17 +5718,20 @@ package body Sem_Eval is
       --  Access types
 
       elsif Is_Access_Type (T1) then
-         return (not Is_Constrained (T2)
-                  or else (Subtypes_Statically_Match
-                             (Designated_Type (T1), Designated_Type (T2))))
+         return
+           (not Is_Constrained (T2)
+             or else Subtypes_Statically_Match
+                       (Designated_Type (T1), Designated_Type (T2)))
            and then not (Can_Never_Be_Null (T2)
                           and then not Can_Never_Be_Null (T1));
 
       --  All other cases
 
       else
-         return (Is_Composite_Type (T1) and then not Is_Constrained (T2))
-           or else Subtypes_Statically_Match (T1, T2, Formal_Derived_Matching);
+         return
+           (Is_Composite_Type (T1) and then not Is_Constrained (T2))
+             or else Subtypes_Statically_Match
+                       (T1, T2, Formal_Derived_Matching);
       end if;
    end Subtypes_Statically_Compatible;
 
@@ -5856,23 +5849,16 @@ package body Sem_Eval is
 
             else
                if not Is_OK_Static_Subtype (T1)
-                 or else not Is_OK_Static_Subtype (T2)
+                    or else
+                  not Is_OK_Static_Subtype (T2)
                then
                   return False;
 
-               --  If either type has constraint error bounds, then say that
-               --  they match to avoid junk cascaded errors here.
-
-               elsif not Is_OK_Static_Subtype (T1)
-                 or else not Is_OK_Static_Subtype (T2)
-               then
-                  return True;
-
                elsif Is_Real_Type (T1) then
                   return
-                    (Expr_Value_R (LB1) = Expr_Value_R (LB2))
+                    Expr_Value_R (LB1) = Expr_Value_R (LB2)
                       and then
-                    (Expr_Value_R (HB1) = Expr_Value_R (HB2));
+                    Expr_Value_R (HB1) = Expr_Value_R (HB2);
 
                else
                   return
index 5e90f7b15a0cd9f8cab4ad2b1df6cf2d1489618e..9cbd22426418af13b2c878f7813e2e701a106241 100644 (file)
@@ -4905,25 +4905,15 @@ package body Sem_Prag is
             then
                return;
 
-            --  Static expression that raises Constraint_Error. This has
-            --  already been flagged, so just exit from pragma processing.
-
-            elsif Is_OK_Static_Expression (Argx) then
-               raise Pragma_Exit;
-
             --  Here we have a real error (non-static expression)
 
             else
                Error_Msg_Name_1 := Pname;
+               Flag_Non_Static_Expr
+                 (Fix_Error ("argument for pragma% must be a identifier or "
+                  & "static string expression!"), Argx);
 
-               declare
-                  Msg : constant String :=
-                          "argument for pragma% must be a identifier or "
-                          & "static string expression!";
-               begin
-                  Flag_Non_Static_Expr (Fix_Error (Msg), Argx);
-                  raise Pragma_Exit;
-               end;
+               raise Pragma_Exit;
             end if;
          end if;
       end Check_Arg_Is_External_Name;
@@ -4936,8 +4926,7 @@ package body Sem_Prag is
          Argx : constant Node_Id := Get_Pragma_Arg (Arg);
       begin
          if Nkind (Argx) /= N_Identifier then
-            Error_Pragma_Arg
-              ("argument for pragma% must be identifier", Argx);
+            Error_Pragma_Arg ("argument for pragma% must be identifier", Argx);
          end if;
       end Check_Arg_Is_Identifier;
 
index 200417a5de0ec921e8b03967f1b4800dc88629dd..b01ee08d2b4765e651675202fe59a59b5d39c614 100644 (file)
@@ -4958,8 +4958,8 @@ package body Sem_Util is
             Eloc := Sloc (N);
          end if;
 
-         --  Copy message to Msgc, converting any ? in the message into
-         --  instead, so that we have an error in GNATprove mode.
+         --  Copy message to Msgc, converting any ? in the message into <
+         --  instead, so that we have an error in GNATprove mode.
 
          Msgl := Msg'Length;
 
@@ -4976,12 +4976,13 @@ package body Sem_Util is
          if Msg (Msg'Last) = '?' or else Msg (Msg'Last) = '<' then
             Wmsg := True;
 
-         --  In Ada 83, all messages are warnings. In the private part and
-         --  the body of an instance, constraint_checks are only warnings.
-         --  We also make this a warning if the Warn parameter is set.
+         --  In Ada 83, all messages are warnings. In the private part and the
+         --  body of an instance, constraint_checks are only warnings. We also
+         --  make this a warning if the Warn parameter is set.
 
          elsif Warn
            or else (Ada_Version = Ada_83 and then Comes_From_Source (N))
+           or else In_Instance_Not_Visible
          then
             Msgl := Msgl + 1;
             Msgc (Msgl) := '<';
@@ -4989,18 +4990,11 @@ package body Sem_Util is
             Msgc (Msgl) := '<';
             Wmsg := True;
 
-         elsif In_Instance_Not_Visible then
-            Msgl := Msgl + 1;
-            Msgc (Msgl) := '<';
-            Msgl := Msgl + 1;
-            Msgc (Msgl) := '<';
-            Wmsg := True;
-
-         --  Otherwise we have a real error message (Ada 95 static case)
-         --  and we make this an unconditional message. Note that in the
-         --  warning case we do not make the message unconditional, it seems
-         --  quite reasonable to delete messages like this (about exceptions
-         --  that will be raised) in dead code.
+         --  Otherwise we have a real error message (Ada 95 static case) and we
+         --  make this an unconditional message. Note that in the warning case
+         --  we do not make the message unconditional, it seems reasonable to
+         --  delete messages like this (about exceptions that will be raised)
+         --  in dead code.
 
          else
             Wmsg := False;
@@ -19118,14 +19112,7 @@ package body Sem_Util is
             end if;
          end if;
 
-      elsif Nkind (Obj) = N_Selected_Component then
-         if Is_Access_Type (Etype (Prefix (Obj))) then
-            return Type_Access_Level (Etype (Prefix (Obj)));
-         else
-            return Object_Access_Level (Prefix (Obj));
-         end if;
-
-      elsif Nkind (Obj) = N_Indexed_Component then
+      elsif Nkind_In (Obj, N_Indexed_Component, N_Selected_Component) then
          if Is_Access_Type (Etype (Prefix (Obj))) then
             return Type_Access_Level (Etype (Prefix (Obj)));
          else
index 562ee0e8412e420bdcaf932ff3faeeaa5ae8bc19..e5a6c87c2a59874dfedcb415bffa389b9f6f8c9e 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2017, 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- --
@@ -300,12 +300,8 @@ package body Uname is
                when N_Compilation_Unit =>
                   Add_Node_Name (Unit (Node));
 
-               when N_Package_Body_Stub =>
-                  Add_Node_Name (Get_Parent (Node));
-                  Add_Char ('.');
-                  Add_Node_Name (Defining_Identifier (Node));
-
-               when N_Protected_Body_Stub
+               when N_Package_Body_Stub
+                  | N_Protected_Body_Stub
                   | N_Task_Body_Stub
                =>
                   Add_Node_Name (Get_Parent (Node));