When a dynamic run-time range check was generated to check the bounds
of an aggregate, the reason was wrong, resulting in an exception
message saying length check failed instead of range check failed.
The following test:

     1. with Ada.Exceptions; use Ada.Exceptions;
     2. with Ada.Text_IO; use Ada.Text_IO;
     3. procedure MissLenCheck is
     4.    function F return Integer is (1);
     5. begin
     6.    begin
     7.       declare
     8.          X : String (F .. F) := (F - 1 => '0');
     9.       begin
    10.          null;
    11.       end;
    12.       Put_Line ("case 1: no exception");
    13.    exception
    14.       when x : others =>
    15.          Put_Line ("case 1: " & Exception_Information (X));
    16.    end;
    17.
    18.    begin
    19.       declare
    20.          Y : String (1 .. 1) := (0 => '0');
                                        |
        >>> warning: lower bound of aggregate out of range
        >>> warning: Constraint_Error will be raised at run time

    21.       begin
    22.          null;
    23.       end;
    24.       Put_Line ("case 2: no exception");
    25.    exception
    26.       when x : others =>
    27.          Put_Line ("case 2: " & Exception_Information (X));
    28.    end;
    29. end MissLenCheck;

generates at run-time:

case 1: Exception name: CONSTRAINT_ERROR
Message: misslencheck.adb:8 range check failed

case 2: Exception name: CONSTRAINT_ERROR
Message: misslencheck.adb:20 range check failed

Before this patch, the first message said length check

Tested on x86_64-pc-linux-gnu, committed on trunk

2014-01-27  Robert Dewar  <de...@adacore.com>

        * exp_aggr.adb (Check_Bounds): Reason is range check, not
        length check.

Index: exp_aggr.adb
===================================================================
--- exp_aggr.adb        (revision 207120)
+++ exp_aggr.adb        (working copy)
@@ -4141,7 +4141,7 @@
             Insert_Action (N,
               Make_Raise_Constraint_Error (Loc,
                 Condition => Cond,
-                Reason    => CE_Length_Check_Failed));
+                Reason    => CE_Range_Check_Failed));
          end if;
       end Check_Bounds;
 

Reply via email to