exp_attr.adb (Expand_N_Attribute_Reference, case Size): Fix error in handling compile...
authorRobert Dewar <dewar@adacore.com>
Wed, 19 Dec 2007 16:23:09 +0000 (17:23 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 19 Dec 2007 16:23:09 +0000 (17:23 +0100)
2007-12-19  Robert Dewar  <dewar@adacore.com>

* exp_attr.adb (Expand_N_Attribute_Reference, case Size): Fix error in
handling compile time known size of record or array (case of front end
layout active, e.g. in GNAAMP).

From-SVN: r131072

gcc/ada/exp_attr.adb

index 4baf55e7e57290590a56fad73b9717e7f107e26d..b7c7d1d56035dd28d5eba0cf45cd18eb3b08914d 100644 (file)
@@ -3756,13 +3756,29 @@ package body Exp_Attr is
          --  Common processing for record and array component case
 
          if Siz /= No_Uint and then Siz /= 0 then
-            Rewrite (N, Make_Integer_Literal (Loc, Siz));
+            declare
+               CS : constant Boolean := Comes_From_Source (N);
 
-            Analyze_And_Resolve (N, Typ);
+            begin
+               Rewrite (N, Make_Integer_Literal (Loc, Siz));
+
+               --  This integer literal is not a static expression. We do not
+               --  call Analyze_And_Resolve here, because this would activate
+               --  the circuit for deciding that a static value was out of
+               --  range, and we don't want that.
 
-            --  The result is not a static expression
+               --  So just manually set the type, mark the expression as non-
+               --  static, and then ensure that the result is checked properly
+               --  if the attribute comes from source (if it was internally
+               --  generated, we never need a constraint check).
 
-            Set_Is_Static_Expression (N, False);
+               Set_Etype (N, Typ);
+               Set_Is_Static_Expression (N, False);
+
+               if CS then
+                  Apply_Constraint_Check (N, Typ);
+               end if;
+            end;
          end if;
       end Size;