===================================================================
@@ -718,7 +718,7 @@
is
begin
if Sloc (N) = Standard_Location then
- return True;
+ return False;
elsif Sloc (N) = No_Location then
return False;
@@ -750,7 +750,7 @@
function In_Extended_Main_Code_Unit (Loc : Source_Ptr) return Boolean is
begin
if Loc = Standard_Location then
- return True;
+ return False;
elsif Loc = No_Location then
return False;
@@ -787,7 +787,7 @@
-- Special value cases
elsif Nloc = Standard_Location then
- return True;
+ return False;
elsif Nloc = No_Location then
return False;
@@ -826,7 +826,7 @@
-- Special value cases
elsif Loc = Standard_Location then
- return True;
+ return False;
elsif Loc = No_Location then
return False;
===================================================================
@@ -520,6 +520,14 @@
-- instantiations are included in the extended main unit for this call.
-- If the main unit is itself a subunit, then the extended main code unit
-- includes its parent unit, and the parent unit spec if it is separate.
+ --
+ -- This routine (and the following three routines) all return False if
+ -- Sloc (N) is No_Location or Standard_Location. In an earlier version,
+ -- they returned True for Standard_Location, but this was odd, and some
+ -- archeology indicated that this was done for the sole benefit of the
+ -- call in Restrict.Check_Restriction_No_Dependence, so we have moved
+ -- the special case check to that routine. This avoids some difficulties
+ -- with some other calls that malfunctioned with the odd return of True.
function In_Extended_Main_Code_Unit (Loc : Source_Ptr) return Boolean;
-- Same function as above, but argument is a source pointer rather
===================================================================
@@ -5468,6 +5468,30 @@
end if;
end if;
+ -- If the SPARK_05 restriction is active, we are not allowed
+ -- to have a call to a subprogram before we see its completion.
+
+ if not Has_Completion (Nam)
+ and then Restriction_Check_Required (SPARK_05)
+
+ -- Don't flag strange internal calls
+
+ and then Comes_From_Source (N)
+ and then Comes_From_Source (Nam)
+
+ -- Only flag calls in extended main source
+
+ and then In_Extended_Main_Source_Unit (Nam)
+ and then In_Extended_Main_Source_Unit (N)
+
+ -- Exclude enumeration literals from this processing
+
+ and then Ekind (Nam) /= E_Enumeration_Literal
+ then
+ Check_SPARK_Restriction
+ ("call to subprogram cannot appear before its body", N);
+ end if;
+
-- Check that this is not a call to a protected procedure or entry from
-- within a protected function.
===================================================================
@@ -625,8 +625,12 @@
begin
-- Ignore call if node U is not in the main source unit. This avoids
-- cascaded errors, e.g. when Ada.Containers units with other units.
+ -- However, allow Standard_Location here, since this catches some cases
+ -- of constructs that get converted to run-time calls.
- if not In_Extended_Main_Source_Unit (U) then
+ if not In_Extended_Main_Source_Unit (U)
+ and then Sloc (U) /= Standard_Location
+ then
return;
end if;