Formal verification constraints already ensure that expressions are free from
side-effects, so no need for removal of side-effects in Alfa mode.
Tested on x86_64-pc-linux-gnu, committed on trunk
2011-11-21 Yannick Moy <[email protected]>
* exp_util.adb (Remove_Side_Effects): Do nothing in Alfa mode.
Index: exp_util.adb
===================================================================
--- exp_util.adb (revision 181574)
+++ exp_util.adb (working copy)
@@ -6420,9 +6420,12 @@
-- Start of processing for Remove_Side_Effects
begin
- -- Handle cases in which there is nothing to do
+ -- Handle cases in which there is nothing to do. In particular,
+ -- side-effects are not removed in Alfa mode for formal verification.
+ -- Instead, formal verification is performed only on those expressions
+ -- provably side-effect free.
- if not Expander_Active then
+ if not Full_Expander_Active then
return;
-- Cannot generate temporaries if the invocation to remove side effects
@@ -6622,15 +6625,6 @@
-- Otherwise we generate a reference to the value
else
- -- An expression which is in Alfa mode is considered side effect free
- -- if the resulting value is captured by a variable or a constant.
-
- if Alfa_Mode
- and then Nkind (Parent (Exp)) = N_Object_Declaration
- then
- return;
- end if;
-
-- Special processing for function calls that return a limited type.
-- We need to build a declaration that will enable build-in-place
-- expansion of the call. This is not done if the context is already
@@ -6665,40 +6659,26 @@
Def_Id := Make_Temporary (Loc, 'R', Exp);
Set_Etype (Def_Id, Exp_Type);
- -- The regular expansion of functions with side effects involves the
- -- generation of an access type to capture the return value found on
- -- the secondary stack. Since Alfa (and why) cannot process access
- -- types, use a different approach which ignores the secondary stack
- -- and "copies" the returned object.
+ Res :=
+ Make_Explicit_Dereference (Loc,
+ Prefix => New_Reference_To (Def_Id, Loc));
- if Alfa_Mode then
- Res := New_Reference_To (Def_Id, Loc);
- Ref_Type := Exp_Type;
+ -- Generate:
+ -- type Ann is access all <Exp_Type>;
- -- Regular expansion utilizing an access type and 'reference
+ Ref_Type := Make_Temporary (Loc, 'A');
- else
- Res :=
- Make_Explicit_Dereference (Loc,
- Prefix => New_Reference_To (Def_Id, Loc));
+ Ptr_Typ_Decl :=
+ Make_Full_Type_Declaration (Loc,
+ Defining_Identifier => Ref_Type,
+ Type_Definition =>
+ Make_Access_To_Object_Definition (Loc,
+ All_Present => True,
+ Subtype_Indication =>
+ New_Reference_To (Exp_Type, Loc)));
- -- Generate:
- -- type Ann is access all <Exp_Type>;
+ Insert_Action (Exp, Ptr_Typ_Decl);
- Ref_Type := Make_Temporary (Loc, 'A');
-
- Ptr_Typ_Decl :=
- Make_Full_Type_Declaration (Loc,
- Defining_Identifier => Ref_Type,
- Type_Definition =>
- Make_Access_To_Object_Definition (Loc,
- All_Present => True,
- Subtype_Indication =>
- New_Reference_To (Exp_Type, Loc)));
-
- Insert_Action (Exp, Ptr_Typ_Decl);
- end if;
-
E := Exp;
if Nkind (E) = N_Explicit_Dereference then
New_Exp := Relocate_Node (Prefix (E));