[Ada] Post warning on object size clause for subtype
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 31 May 2018 10:45:57 +0000 (10:45 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 31 May 2018 10:45:57 +0000 (10:45 +0000)
This ensures that a warning for an object size clause present on a subtype
is posted on the clause and not on a size clause present on the type.

2018-05-31  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* einfo.ads (Object_Size_Clause): Declare.
* einfo.adb (Object_Size_Clause): New function.
* gcc-interface/utils.c (maybe_pad_type): Test Has_Size_Clause before
retrieving Size_Clause and post the warning on the object size clause
if Has_Object_Size_Clause is true.

gcc/testsuite/

* gnat.dg/size_clause1.adb: New testcase.

From-SVN: r260998

gcc/ada/ChangeLog
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/gcc-interface/utils.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/size_clause1.adb [new file with mode: 0644]

index cec6c39879ac5ee6e5b6d7cb2db1f2fc0c9e1bad..587516cb85b8dd608eb66506b002f57bdbf83295 100644 (file)
@@ -1,3 +1,11 @@
+2018-05-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * einfo.ads (Object_Size_Clause): Declare.
+       * einfo.adb (Object_Size_Clause): New function.
+       * gcc-interface/utils.c (maybe_pad_type): Test Has_Size_Clause before
+       retrieving Size_Clause and post the warning on the object size clause
+       if Has_Object_Size_Clause is true.
+
 2018-05-31  Javier Miranda  <miranda@adacore.com>
 
        * sem_util.ads, sem_util.adb (Find_Primitive_Eq): New subprogram.
index 320b16715ed793312ce4554239b24d79f9e00a8c..c41dc30bd908f6bfc47c9697dd129c20ce485187 100644 (file)
@@ -8755,6 +8755,15 @@ package body Einfo is
       return N;
    end Number_Formals;
 
+   ------------------------
+   -- Object_Size_Clause --
+   ------------------------
+
+   function Object_Size_Clause (Id : E) return N is
+   begin
+      return Get_Attribute_Definition_Clause (Id, Attribute_Object_Size);
+   end Object_Size_Clause;
+
    --------------------
    -- Parameter_Mode --
    --------------------
index 9a7206ffc15fcaa94a1e06c4cadb8cb89aa29641..2df649731c8e3a55c893319233801ddfed735d31 100644 (file)
@@ -1828,7 +1828,7 @@ package Einfo is
 
 --    Has_Object_Size_Clause (Flag172)
 --       Defined in entities for types and subtypes. Set if an Object_Size
---       clause has been processed for the type Used to prevent multiple
+--       clause has been processed for the type. Used to prevent multiple
 --       Object_Size clauses for a given entity.
 
 --    Has_Out_Or_In_Out_Parameter (Flag110)
@@ -3753,6 +3753,15 @@ package Einfo is
 --       Applies to subprograms and subprogram types. Yields the number of
 --       formals as a value of type Pos.
 
+--    Object_Size_Clause (synthesized)
+--       Applies to entities for types and subtypes. If an object size clause
+--       is present in the rep item chain for an entity then the attribute
+--       definition clause node is returned. Otherwise Object_Size_Clause
+--       returns Empty if no item is present. Usually this is only meaningful
+--       if the flag Has_Object_Size_Clause is set. This is because when the
+--       representation item chain is copied for a derived type, it can inherit
+--       an object size clause that is not applicable to the entity.
+
 --    OK_To_Rename (Flag247)
 --       Defined only in entities for variables. If this flag is set, it
 --       means that if the entity is used as the initial value of an object
@@ -5782,6 +5791,7 @@ package Einfo is
    --    Is_Access_Protected_Subprogram_Type (synth)
    --    Is_Atomic_Or_VFA                    (synth)
    --    Is_Controlled                       (synth)
+   --    Object_Size_Clause                  (synth)
    --    Partial_Invariant_Procedure         (synth)
    --    Predicate_Function                  (synth)
    --    Predicate_Function_M                (synth)
@@ -7673,6 +7683,7 @@ package Einfo is
    function Number_Dimensions                   (Id : E) return Pos;
    function Number_Entries                      (Id : E) return Nat;
    function Number_Formals                      (Id : E) return Pos;
+   function Object_Size_Clause                  (Id : E) return N;
    function Parameter_Mode                      (Id : E) return Formal_Kind;
    function Partial_Refinement_Constituents     (Id : E) return L;
    function Primitive_Operations                (Id : E) return L;
index cc25973c2e90b65dffed234d4ddfe9246dd5e8de..7de766375d43c30b5b26d55297c1914cc27b60f4 100644 (file)
@@ -1507,7 +1507,7 @@ built:
               || TREE_OVERFLOW (orig_size)
               || tree_int_cst_lt (size, orig_size))))
     {
-      Node_Id gnat_error_node = Empty;
+      Node_Id gnat_error_node;
 
       /* For a packed array, post the message on the original array type.  */
       if (Is_Packed_Array_Impl_Type (gnat_entity))
@@ -1517,8 +1517,12 @@ built:
           || Ekind (gnat_entity) == E_Discriminant)
          && Present (Component_Clause (gnat_entity)))
        gnat_error_node = Last_Bit (Component_Clause (gnat_entity));
-      else if (Present (Size_Clause (gnat_entity)))
+      else if (Has_Size_Clause (gnat_entity))
        gnat_error_node = Expression (Size_Clause (gnat_entity));
+      else if (Has_Object_Size_Clause (gnat_entity))
+       gnat_error_node = Expression (Object_Size_Clause (gnat_entity));
+      else
+       gnat_error_node = Empty;
 
       /* Generate message only for entities that come from source, since
         if we have an entity created by expansion, the message will be
index d5f177e5ed51f0e43028613de78e671818a27777..0c7a85d2f6c44bef3ae091c25eff1c2d7a2b3348 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/size_clause1.adb: New testcase.
+
 2018-05-31  Javier Miranda  <miranda@adacore.com>
 
        * gnat.dg/tagged1.adb, gnat.dg/tagged1.ads: New testcase.
diff --git a/gcc/testsuite/gnat.dg/size_clause1.adb b/gcc/testsuite/gnat.dg/size_clause1.adb
new file mode 100644 (file)
index 0000000..fc090eb
--- /dev/null
@@ -0,0 +1,11 @@
+procedure Size_Clause1 is
+
+  type Modular is mod 2**64;
+  for Modular'Size use 64;
+
+  subtype Enlarged_Modular is Modular;
+  for Enlarged_Modular'Object_Size use 128; --  { dg-warning "warning: 64 bits of \"Enlarged_Modular\" unused" }
+
+begin
+    null;
+end Size_Clause1;