The source location of an expression may not be the best place to put a message,
in the case of a failed assertion. For example, it gets located on the last
"and" keyword in a chain of boolean expressiond and'ed together. It is best to
put the message on the first character of an assertion, which is done here.

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

2011-11-21  Yannick Moy  <m...@adacore.com>

        * exp_prag.adb (Expand_Pragma_Check): Place error on first character
        of expression.
        * sem_res.adb (Resolve_Short_Circuit): Place error on first
        character of expression.

Index: exp_prag.adb
===================================================================
--- exp_prag.adb        (revision 181574)
+++ exp_prag.adb        (working copy)
@@ -270,7 +270,7 @@
 
    procedure Expand_Pragma_Check (N : Node_Id) is
       Cond : constant Node_Id    := Arg2 (N);
-      Loc  : constant Source_Ptr := Sloc (Cond);
+      Loc  : constant Source_Ptr := Sloc (First_Node (Cond));
       Nam  : constant Name_Id    := Chars (Arg1 (N));
       Msg  : Node_Id;
 
Index: sem_res.adb
===================================================================
--- sem_res.adb (revision 181574)
+++ sem_res.adb (working copy)
@@ -8668,7 +8668,7 @@
                      --  this by making sure that the expanded code points to
                      --  the Sloc of the expression, not the original pragma.
 
-                     Error_Msg_N
+                     Error_Msg_F
                        ("?assertion would fail at run time!",
                         Expression
                           (First (Pragma_Argument_Associations (Orig))));
@@ -8694,7 +8694,7 @@
                   then
                      null;
                   else
-                     Error_Msg_N
+                     Error_Msg_F
                        ("?check would fail at run time!",
                         Expression
                           (Last (Pragma_Argument_Associations (Orig))));

Reply via email to