exp_attr.adb (Expand_N_Attribute_Reference): Make sure prefix of constructed 'Valid...
authorRobert Dewar <dewar@adacore.com>
Mon, 4 Aug 2014 10:46:25 +0000 (10:46 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 4 Aug 2014 10:46:25 +0000 (12:46 +0200)
2014-08-04  Robert Dewar  <dewar@adacore.com>

* exp_attr.adb (Expand_N_Attribute_Reference): Make sure prefix
of constructed 'Valid attribute in -gnatVa mode does not appear
to come from source.
* sem_attr.adb (Analyze_Access_Attribute): Don't set
Never_Set_In_Source for non-source reference.
* sem_util.adb: Minor reformatting.
* sem_warn.adb (Check_References): Don't check Address_Taken,
not necessary, see comment.

From-SVN: r213568

gcc/ada/ChangeLog
gcc/ada/exp_attr.adb
gcc/ada/sem_attr.adb
gcc/ada/sem_util.adb
gcc/ada/sem_warn.adb

index 0d70e1b3183fc5f6cb25988267e80d16a14e686c..ea25404364776e796693f7bd802ddac41a8ea3b3 100644 (file)
@@ -1,3 +1,14 @@
+2014-08-04  Robert Dewar  <dewar@adacore.com>
+
+       * exp_attr.adb (Expand_N_Attribute_Reference): Make sure prefix
+       of constructed 'Valid attribute in -gnatVa mode does not appear
+       to come from source.
+       * sem_attr.adb (Analyze_Access_Attribute): Don't set
+       Never_Set_In_Source for non-source reference.
+       * sem_util.adb: Minor reformatting.
+       * sem_warn.adb (Check_References): Don't check Address_Taken,
+       not necessary, see comment.
+
 2014-08-04  Robert Dewar  <dewar@adacore.com>
 
        * sem_util.adb, sem_case.adb: Minor reformatting.
index f9c1745c99b052afffe32478632a330f59165a36..d2cd8e4fcfb2865ac27f12592609937e37825c05 100644 (file)
@@ -6448,13 +6448,19 @@ package body Exp_Attr is
                      end if;
 
                      --  We now have an object of the proper endianness and
-                     --  alignment, and can call the Valid runtime routine.
+                     --  alignment, and can construct a Valid attribute.
+
+                     --  We make sure the prefix of this valid attribute is
+                     --  marked as not coming from source, to avoid losing
+                     --  warnings from 'Valid looking like a possible update.
+
+                     Set_Comes_From_Source (Pref, False);
 
                      Expand_Fpt_Attribute
                        (N, Pkg, Name_Valid,
                         New_List (
                           Make_Attribute_Reference (Loc,
-                            Prefix => Unchecked_Convert_To (Ftp, Pref),
+                            Prefix         => Unchecked_Convert_To (Ftp, Pref),
                             Attribute_Name => Name_Unrestricted_Access)));
                end case;
 
index aecb69a4e948c36c574a5336e8146bd0a42aa9ce..cdb3cfe33c2b34308f507817d678a236b3093f86 100644 (file)
@@ -1005,7 +1005,13 @@ package body Sem_Attr is
                   --  pointer can be used to modify the variable, and we might
                   --  not detect this, leading to some junk warnings.
 
-                  Set_Never_Set_In_Source (Ent, False);
+                  --  We only do this for source references, since otherwise
+                  --  we can suppress warnings, e.g. from the unrestricted
+                  --  access generated for validity checks in -gnatVa mode.
+
+                  if Comes_From_Source (N) then
+                     Set_Never_Set_In_Source (Ent, False);
+                  end if;
 
                   --  Mark entity as address taken, and kill current values
 
index dd6206dc265b4a09e6f9e966ec2e4e78077f8f01..832c320b9032f1f5916efa3bdba467a3e254c8c9 100644 (file)
@@ -14557,8 +14557,7 @@ package body Sem_Util is
             --  this modifies a constant, then give an appropriate warning.
 
             if Overlays_Constant (Ent)
-              and then Modification_Comes_From_Source
-              and then Sure
+              and then (Modification_Comes_From_Source and Sure)
             then
                declare
                   A : constant Node_Id := Address_Clause (Ent);
index d52e2d7d85213a556e1d81b0f4c4c465ce60d503..e8c8f0b1f7f529eefe3159dc41943f3b41a18c5e 100644 (file)
@@ -1110,11 +1110,15 @@ package body Sem_Warn is
                --  since a given instance could have modifications outside
                --  the package.
 
+               --  Note that we used to check Address_Taken here, but we don't
+               --  want to do that since it can be set for non-source cases,
+               --  e.g. the Unrestricted_Access from a valid attribute, and
+               --  the wanted effect is included in Never_Set_In_Source.
+
                elsif Warn_On_Constant
                  and then (Ekind (E1) = E_Variable
                             and then Has_Initial_Value (E1))
                  and then Never_Set_In_Source_Check_Spec (E1)
-                 and then not Address_Taken (E1)
                  and then not Generic_Package_Spec_Entity (E1)
                then
                   --  A special case, if this variable is volatile and not