+2014-01-29 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * einfo.adb (Get_Pragma): Handle the retrieval of pragma Refined_Post.
+ * einfo.ads (Get_Pragma): Update the comment on special pragmas
+ handled by this routine.
+ * sem_prag.adb (Analyze_Pragma): Add a legal pragma Refined_Post
+ to the contract of the related subprogram body.
+ * sem_util.adb (Add_Contract_Item): Handle the insertion of
+ pragma Refined_Post into the contract of a subprogram body.
+ * sinfo.ads Update the documentation of node N_Contract.
+ * sem_res.adb (Resolve_Entity_Name): Add a guard
+ to detect abstract states and variables only when checking the
+ SPARK 2014 rules concerning volatile object placement.
+
+2014-01-29 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch4.adb (Find_Equality_Types, Try_One_Interp): within an instance,
+ null is compatible with any access type.
+
2014-01-29 Hristian Kirtchev <kirtchev@adacore.com>
* sem_util.adb (Find_Placement_In_State_Space): Assume that the default
Id = Pragma_Test_Case;
Is_PPC : constant Boolean :=
Id = Pragma_Precondition or else
- Id = Pragma_Postcondition;
+ Id = Pragma_Postcondition or else
+ Id = Pragma_Refined_Post;
In_Contract : constant Boolean := Is_CDG or Is_CTC or Is_PPC;
-- Postcondition
-- Refined_Depends
-- Refined_Global
+ -- Refined_Post
-- Refined_State
+ -- Test_Case
function Get_Record_Representation_Clause (E : Entity_Id) return Node_Id;
-- Searches the Rep_Item chain for a given entity E, for a record
-- In Ada 2005, the equality on anonymous access types is declared
-- in Standard, and is always visible.
+ -- In an instance, the type may have been immediately visible.
+ -- Either the types are compatible, or one operand is universal
+ -- (numeric or null).
elsif In_Open_Scopes (Scope (Bas))
or else Is_Potentially_Use_Visible (Bas)
or else (In_Instance
and then
(First_Subtype (T1) = First_Subtype (Etype (R))
+ or else Nkind (R) = N_Null
or else
(Is_Numeric_Type (T1)
and then Is_Universal_Numeric_Type (Etype (R)))))
("pragma % does not mention function result?T?");
end if;
end if;
+
+ -- Chain the pragma on the contract for easy retrieval
+
+ Add_Contract_Item (N, Body_Id);
end if;
end Refined_Post;
-- standard Ada legality rules.
if SPARK_Mode = On
+ and then Ekind_In (E, E_Abstract_State, E_Variable)
and then Is_SPARK_Volatile_Object (E)
and then
(Async_Writers_Enabled (E)
-- are:
-- Refined_Depends
-- Refined_Global
+ -- Refined_Post
elsif Ekind (Id) = E_Subprogram_Body then
- if Nam_In (Nam, Name_Refined_Depends, Name_Refined_Global) then
+ if Nam = Name_Refined_Post then
+ Set_Next_Pragma (Prag, Pre_Post_Conditions (Items));
+ Set_Pre_Post_Conditions (Items, Prag);
+
+ elsif Nam_In (Nam, Name_Refined_Depends, Name_Refined_Global) then
Set_Next_Pragma (Prag, Classifications (Items));
Set_Classifications (Items, Prag);
-- Postcondition
-- Pre
-- Precondition
+ -- Refined_Post
-- The ordering in the list is in LIFO fashion.
-- Note that there might be multiple preconditions or postconditions