[Ada] Fix crash for bad Depends operand

Arnaud Charlet charlet@adacore.com
Fri Jan 24 11:42:00 GMT 2014


This fixes a failure to properly diagnose a bad Depends operand.
The following program used to provoke this crash:

     1. procedure DependsCrash is
     2.    type R is record
     3.       B : Boolean;
     4.    end record;
     5.
     6.    procedure Test (X : R; B : out Boolean)
                           |
        >>> item "X" must appear in at least one input list
            of aspect Depends

     7.      with Depends => (B => X.B);
                                    |
        >>> item must denote variable, state or formal
            parameter

     8.
     9.    procedure Test (X : R; B : out Boolean)
    10.    is begin null; end;
    11.
    12. begin
    13.    null;
    14. end DependsCrash;

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

2014-01-24  Robert Dewar  <dewar@adacore.com>

	* sem_prag.adb (Analyze_Input_Output): Add missing error check
	for junk operand.
	* sem_util.adb (Is_Refined_State): Add defense against junk
	tree from error.

-------------- next part --------------
Index: sem_prag.adb
===================================================================
--- sem_prag.adb	(revision 207026)
+++ sem_prag.adb	(working copy)
@@ -783,9 +783,9 @@
 
                Item_Id := Entity_Of (Item);
 
-               Record_Possible_Body_Reference (Item, Item_Id);
+               if Present (Item_Id) then
+                  Record_Possible_Body_Reference (Item, Item_Id);
 
-               if Present (Item_Id) then
                   if Ekind_In (Item_Id, E_Abstract_State,
                                         E_In_Parameter,
                                         E_In_Out_Parameter,
Index: sem_util.adb
===================================================================
--- sem_util.adb	(revision 207026)
+++ sem_util.adb	(working copy)
@@ -3723,6 +3723,12 @@
          else
             Item_Id := Entity_Of (Item);
 
+            --  Defend against junk
+
+            if No (Item_Id) then
+               return False;
+            end if;
+
             return
               Ekind (Item_Id) = E_Abstract_State
                 and then Has_Visible_Refinement (Item_Id);


More information about the Gcc-patches mailing list