* [Ada] Accept a constituent in a null dependency clause
@ 2014-02-19 10:26 Arnaud Charlet
0 siblings, 0 replies; only message in thread
From: Arnaud Charlet @ 2014-02-19 10:26 UTC (permalink / raw)
To: gcc-patches; +Cc: Hristian Kirtchev
[-- Attachment #1: Type: text/plain, Size: 1678 bytes --]
This patch implements the following SPARK RM rule from 7.2.5 (3g):
at least one of its constituents shall be denoted in the input_list of a
null_dependency_clause; or
------------
-- Source --
------------
-- null_dependency.ads
package Null_Dependency
with Abstract_State => (Input_State, Output_State)
is
procedure OK_1
with Global => (Input => Input_State),
Depends => (null => Input_State);
procedure OK_2
with Global => (Input => Input_State,
Output => Output_State),
Depends => (Output_State => Input_State);
end Null_Dependency;
-- null_dependency.adb
package body Null_Dependency
with Refined_State => (Input_State => (C1, C2),
Output_State => (C3, C4))
is
C1, C2, C3, C4 : Integer := 0;
procedure OK_1
with Refined_Global => (Input => C1),
Refined_Depends => (null => C1)
is begin null; end OK_1;
procedure OK_2
with Refined_Global => (Input => (C1, C2),
Output => (C3, C4)),
Refined_Depends => ((C3, C4) => C1,
null => C2)
is begin null; end OK_2;
end Null_Dependency;
-----------------
-- Compilation --
-----------------
$ gcc -c null_dependency.adb
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-02-19 Hristian Kirtchev <kirtchev@adacore.com>
* sem_prag.adb (Check_Dependency_Clause): Account
for the case where a state with a non-null refinement matches a
null output list. Comment reformatting.
(Inputs_Match): Copy a solitary input to avoid an assertion failure
when trying to match the same input in multiple clauses.
[-- Attachment #2: difs --]
[-- Type: text/plain, Size: 3816 bytes --]
Index: sem_prag.adb
===================================================================
--- sem_prag.adb (revision 207879)
+++ sem_prag.adb (working copy)
@@ -21434,16 +21434,38 @@
elsif Has_Non_Null_Refinement (Dep_Id) then
Has_Refined_State := True;
- if Is_Entity_Name (Ref_Output) then
+ -- Account for the case where a state with a non-null
+ -- refinement matches a null output list:
+
+ -- Refined_State => (State_1 => (C1, C2),
+ -- State_2 => (C3, C4))
+ -- Depends => (State_1 => State_2)
+ -- Refined_Depends => (null => C3)
+
+ if Nkind (Ref_Output) = N_Null
+ and then Inputs_Match
+ (Dep_Clause => Dep_Clause,
+ Ref_Clause => Ref_Clause,
+ Post_Errors => False)
+ then
+ Has_Constituent := True;
+
+ -- Note that the search continues after the clause is
+ -- removed from the pool of candidates because it may
+ -- have been normalized into multiple simple clauses.
+
+ Remove (Ref_Clause);
+
+ -- Otherwise the output of the refinement clause must be
+ -- a valid constituent of the state:
+
+ -- Refined_State => (State => (C1, C2))
+ -- Depends => (State => <input>)
+ -- Refined_Depends => (C1 => <input>)
+
+ elsif Is_Entity_Name (Ref_Output) then
Ref_Id := Entity_Of (Ref_Output);
- -- The output of the refinement clause is a valid
- -- constituent of the state. Remove the clause from
- -- the pool of candidates if both input lists match.
- -- Note that the search continues because one clause
- -- may have been normalized into multiple clauses as
- -- per the example above.
-
if Ekind_In (Ref_Id, E_Abstract_State, E_Variable)
and then Present (Encapsulating_State (Ref_Id))
and then Encapsulating_State (Ref_Id) = Dep_Id
@@ -21453,6 +21475,12 @@
Post_Errors => False)
then
Has_Constituent := True;
+
+ -- Note that the search continues after the clause
+ -- is removed from the pool of candidates because
+ -- it may have been normalized into multiple simple
+ -- clauses.
+
Remove (Ref_Clause);
end if;
end if;
@@ -21819,12 +21847,13 @@
begin
-- Construct a list of all refinement inputs. Note that the input
-- list is copied because the algorithm modifies its contents and
- -- this should not be visible in Refined_Depends.
+ -- this should not be visible in Refined_Depends. The same applies
+ -- for a solitary input.
if Nkind (Inputs) = N_Aggregate then
Ref_Inputs := New_Copy_List (Expressions (Inputs));
else
- Ref_Inputs := New_List (Inputs);
+ Ref_Inputs := New_List (New_Copy (Inputs));
end if;
-- Depending on whether the original dependency clause mentions
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2014-02-19 10:26 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-19 10:26 [Ada] Accept a constituent in a null dependency clause Arnaud Charlet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).