[Ada] Spurious error reported by pragma Compile_Time_Error
authorJavier Miranda <miranda@adacore.com>
Mon, 8 Jul 2019 08:13:00 +0000 (08:13 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 8 Jul 2019 08:13:00 +0000 (08:13 +0000)
The compiler may trigger spurious errors on pragmas Compile_Time_Error
and Compile_Time_Warning when their boolean expression computes the size
of a type. After this patch the following test compiles fine.

with Interfaces; use Interfaces;
package Types is
   type Arr is array (1 .. 6) of Unsigned_8
     with Size      => 48,
          Alignment => 1;

   type Rec is record
      Comp_1 : Unsigned_32;
      Comp_2 : Unsigned_16;
   end record
     with Size      => 48,
          Alignment => 1;
end Types;

with Types; use Types;
package Main is
   pragma Compile_Time_Error
     (Arr'Size  = 12, "ERROR: Arr'Size is 48, not 12");
   pragma Compile_Time_Error
     (Arr'Size  = 48, "OK: Arr");
   pragma Compile_Time_Error
     (Arr'Size /= 48, "ERROR: Arr'Size is 48");

   pragma Compile_Time_Error
     (Rec'Size  = 34, "ERROR: Rec'Size is 48, not 34");
   pragma Compile_Time_Error
     (Rec'Size  = 48, "OK: Rec");
   pragma Compile_Time_Error
     (Rec'Size /= 48, "ERROR: Rec'Size is 48");
end Main;

Command: gcc -c main.ads
 Output: main.ads:7:07: OK: Arr
         main.ads:14:07: OK: Rec

2019-07-08  Javier Miranda  <miranda@adacore.com>

gcc/ada/

* sem_attr.adb (Analyze_Attribute [Attribute_Size]): For pragmas
used to report user defined compile time warning or errors
handle 'Size for types with known static RM size.

From-SVN: r273200

gcc/ada/ChangeLog
gcc/ada/sem_attr.adb

index 528556acc8be0a95dbed9a5354e9c5e4d4c9b4e0..9a86909fe68b11026104e8c723a14e2813cfc302 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-08  Javier Miranda  <miranda@adacore.com>
+
+       * sem_attr.adb (Analyze_Attribute [Attribute_Size]): For pragmas
+       used to report user defined compile time warning or errors
+       handle 'Size for types with known static RM size.
+
 2019-07-08  Justin Squirek  <squirek@adacore.com>
 
        * exp_imgv.adb (Build_Enumeration_Image_Tables): Default SSO for
index a3f9ffdb23b449091de6b6563f768545e12f6f3d..4c6cba65a4439a171208d32e024c9557bb7cab9c 100644 (file)
@@ -5848,8 +5848,19 @@ package body Sem_Attr is
                       or else Ekind (Entity (P)) = E_Enumeration_Literal)
            and then Size_Known_At_Compile_Time (Entity (P))
          then
-            Rewrite (N, Make_Integer_Literal (Sloc (N), Esize (Entity (P))));
-            Analyze (N);
+            declare
+               Siz : Uint;
+
+            begin
+               if Known_Static_RM_Size (Entity (P)) then
+                  Siz := RM_Size (Entity (P));
+               else
+                  Siz := Esize (Entity (P));
+               end if;
+
+               Rewrite (N, Make_Integer_Literal (Sloc (N), Siz));
+               Analyze (N);
+            end;
          end if;
 
       -----------