From 5884c232046e65f6b617ee69f34b4c90a31b68eb Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Mon, 8 Jul 2013 10:17:14 +0200 Subject: [PATCH] [multiple changes] 2013-07-08 Robert Dewar * rtsfind.adb: Minor comment fix. 2013-07-08 Hristian Kirtchev * 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 * 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. From-SVN: r200772 --- gcc/ada/ChangeLog | 16 ++++++++++++++++ gcc/ada/exp_ch6.adb | 12 +++++++++--- gcc/ada/rtsfind.adb | 4 ++-- gcc/ada/sem_ch4.adb | 25 ++++++++++++++++++++----- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ac3876e47d4..b5089150855 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,19 @@ +2013-07-08 Robert Dewar + + * rtsfind.adb: Minor comment fix. + +2013-07-08 Hristian Kirtchev + + * 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 + + * 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 * sem.ads: Minor comment updates. diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index d944ac9ca08..d48544fdada 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -4680,7 +4680,8 @@ package body Exp_Ch6 is 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 @@ -4808,9 +4809,14 @@ package body Exp_Ch6 is -- 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)), diff --git a/gcc/ada/rtsfind.adb b/gcc/ada/rtsfind.adb index ecd1cd6b4e8..22abb9a581f 100644 --- a/gcc/ada/rtsfind.adb +++ b/gcc/ada/rtsfind.adb @@ -839,8 +839,8 @@ package body Rtsfind is 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)); diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 393195765a9..a03c46552be 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -881,12 +881,24 @@ package body Sem_Ch4 is 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 @@ -898,11 +910,14 @@ package body Sem_Ch4 is 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; -------------------------------------------------- -- 2.30.2