-- pragma SPARK_Mode [(On | Off | Auto)];
- when Pragma_SPARK_Mode => SPARK_Mod : declare
+ when Pragma_SPARK_Mode => Do_SPARK_Mode : declare
Body_Id : Entity_Id;
Context : Node_Id;
Mode : Name_Id;
-- verify that the new mode is less restrictive than the old mode.
-- For example, if the old mode is ON, then the new mode can be
-- anything. But if the old mode is OFF, then the only allowed
- -- new mode is also OFF. If there is no error, this routine also
- -- sets SPARK_Mode_Pragma to N, and SPARK_Mode to Mode_Id.
+ -- new mode is also OFF.
function Get_SPARK_Mode_Name (Id : SPARK_Mode_Type) return Name_Id;
-- Convert a value of type SPARK_Mode_Type to corresponding name
if Present (Old_Pragma) then
pragma Assert (Nkind (Old_Pragma) = N_Pragma);
- declare
- Gov_M : constant SPARK_Mode_Type :=
- Get_SPARK_Mode_From_Pragma (Old_Pragma);
-
- begin
- -- New mode less restrictive than the established mode
+ -- New mode less restrictive than the established mode
- if Gov_M < Mode_Id then
- Error_Msg_Name_1 := Mode;
- Error_Msg_N ("cannot define 'S'P'A'R'K mode %", Arg1);
+ if Get_SPARK_Mode_From_Pragma (Old_Pragma) < Mode_Id then
+ Error_Msg_Name_1 := Mode;
+ Error_Msg_N ("cannot define 'S'P'A'R'K mode %", Arg1);
- Error_Msg_Name_1 := Get_SPARK_Mode_Name (SPARK_Mode);
- Error_Msg_Sloc := Sloc (SPARK_Mode_Pragma);
- Error_Msg_N
- ("\mode is less restrictive than mode "
- & "% defined #", Arg1);
- raise Pragma_Exit;
- end if;
- end;
+ Error_Msg_Name_1 := Get_SPARK_Mode_Name (SPARK_Mode);
+ Error_Msg_Sloc := Sloc (SPARK_Mode_Pragma);
+ Error_Msg_N
+ ("\mode is less restrictive than mode "
+ & "% defined #", Arg1);
+ raise Pragma_Exit;
+ end if;
end if;
-
- SPARK_Mode_Pragma := N;
- SPARK_Mode := Mode_Id;
end Check_Pragma_Conformance;
-------------------------
end if;
end Get_SPARK_Mode_Name;
- -- Start of processing for SPARK_Mod
+ -- Start of processing for Do_SPARK_Mode
begin
GNAT_Pragma;
-- The pragma applies to a [library unit] subprogram or package
else
- -- Mode "Auto" cannot be used in nested subprograms or packages
+ -- Mode "Auto" can only be used in a configuration pragma
if Mode_Id = Auto then
Error_Pragma_Arg
if List_Containing (N) = Private_Declarations (Context) then
Check_Pragma_Conformance (SPARK_Aux_Pragma (Spec_Id));
+ SPARK_Mode_Pragma := N;
+ SPARK_Mode := Mode_Id;
+
Set_SPARK_Aux_Pragma (Spec_Id, N);
Set_SPARK_Aux_Pragma_Inherited (Spec_Id, False);
else
Check_Pragma_Conformance (SPARK_Pragma (Spec_Id));
+ SPARK_Mode_Pragma := N;
+ SPARK_Mode := Mode_Id;
+
Set_SPARK_Pragma (Spec_Id, N);
Set_SPARK_Pragma_Inherited (Spec_Id, False);
Set_SPARK_Aux_Pragma (Spec_Id, N);
Spec_Id := Corresponding_Spec (Context);
Body_Id := Defining_Entity (Context);
Check_Pragma_Conformance (SPARK_Pragma (Body_Id));
+ SPARK_Mode_Pragma := N;
+ SPARK_Mode := Mode_Id;
Set_SPARK_Pragma (Body_Id, N);
Set_SPARK_Pragma_Inherited (Body_Id, False);
Context := Specification (Context);
Body_Id := Defining_Entity (Context);
Check_Pragma_Conformance (SPARK_Pragma (Body_Id));
+ SPARK_Mode_Pragma := N;
+ SPARK_Mode := Mode_Id;
Set_SPARK_Pragma (Body_Id, N);
Set_SPARK_Pragma_Inherited (Body_Id, False);
Spec_Id := Corresponding_Spec (Context);
Body_Id := Defining_Unit_Name (Context);
Check_Pragma_Conformance (SPARK_Aux_Pragma (Body_Id));
+ SPARK_Mode_Pragma := N;
+ SPARK_Mode := Mode_Id;
Set_SPARK_Aux_Pragma (Body_Id, N);
Set_SPARK_Aux_Pragma_Inherited (Body_Id, False);
Pragma_Misplaced;
end if;
end if;
- end SPARK_Mod;
+ end Do_SPARK_Mode;
--------------------------------
-- Static_Elaboration_Desired --