2013-07-08 Robert Dewar <dewar@adacore.com>
+ * rtsfind.adb: Minor comment fix.
+
+2013-07-08 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * sem_ch4.adb (Check_Ghost_Subprogram_Call): Do not check the placement
+ of a Ghost function call when the enclosing context is being
+ preanalyzed.
+
+2013-07-08 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch6.adb (Expand_Inlined_Call, Process_Formals): If the
+ expression in a return statement is a numeric literal, qualify
+ it with the return type for proper resolution.
+
+2013-07-08 Robert Dewar <dewar@adacore.com>
+
* sem.ads: Minor comment updates.
* s-restri.ads, exp_ch6.adb, lib-load.ads, exp_ch3.adb, sem_ch10.adb:
Minor reformatting.
function Process_Formals (N : Node_Id) return Traverse_Result;
-- Replace occurrence of a formal with the corresponding actual, or the
- -- thunk generated for it.
+ -- thunk generated for it. Replace a return statement with an assignment
+ -- to the target of the call, with appropriate conversions if needed.
function Process_Sloc (Nod : Node_Id) return Traverse_Result;
-- If the call being expanded is that of an internal subprogram, set the
-- errors, e.g. when the expression is a numeric literal and
-- the context is private. If the expression is an aggregate,
-- use a qualified expression, because an aggregate is not a
- -- legal argument of a conversion.
+ -- legal argument of a conversion. Ditto for numeric literals,
+ -- which must be resolved to a specific type.
- if Nkind_In (Expression (N), N_Aggregate, N_Null) then
+ if Nkind_In (Expression (N), N_Aggregate,
+ N_Null,
+ N_Real_Literal,
+ N_Integer_Literal)
+ then
Ret :=
Make_Qualified_Expression (Sloc (N),
Subtype_Mark => New_Occurrence_Of (Ret_Type, Sloc (N)),
return;
end if;
- -- Add the with_clause, if not already in the context of the current
- -- compilation unit.
+ -- Add the with_clause, if we have not already added an implicit with
+ -- for this unit to the current compilation unit.
declare
LibUnit : constant Node_Id := Unit (Cunit (U.Unum));
S : Entity_Id;
begin
+ -- Do not perform the check while preanalyzing the enclosing context
+ -- because the call is not in its final place. Premature attempts to
+ -- verify the placement lead to bogus errors.
+
+ if In_Spec_Expression then
+ return;
+
-- The ghost subprogram appears inside an assertion expression
+ -- which is one of the allowed cases.
- if In_Assertion_Expression (N) then
+ elsif In_Assertion_Expression (N) then
return;
+ -- Otherwise see if it inside another ghost subprogram
+
else
+ -- Loop to climb scopes
+
S := Current_Scope;
while Present (S) and then S /= Standard_Standard loop
S := Scope (S);
end loop;
- end if;
- Error_Msg_N
- ("call to ghost subprogram must appear in assertion expression or "
- & "another ghost subprogram", N);
+ -- If we fall through the loop it was not within another
+ -- ghost subprogram, so we have bad placement.
+
+ Error_Msg_N
+ ("call to ghost subprogram must appear in assertion expression "
+ & "or another ghost subprogram", N);
+ end if;
end Check_Ghost_Subprogram_Call;
--------------------------------------------------