aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2013-07-08 10:17:14 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2013-07-08 10:17:14 +0200
commit5884c232046e65f6b617ee69f34b4c90a31b68eb (patch)
tree262cecab20751245724b41e9418de2b1e18d13b3 /gcc/ada
parent2cbac6c692b9a68e9fedaa193ae756eea8ac23c5 (diff)
downloadgcc-5884c232046e65f6b617ee69f34b4c90a31b68eb.zip
gcc-5884c232046e65f6b617ee69f34b4c90a31b68eb.tar.gz
gcc-5884c232046e65f6b617ee69f34b4c90a31b68eb.tar.bz2
[multiple changes]
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. From-SVN: r200772
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog16
-rw-r--r--gcc/ada/exp_ch6.adb12
-rw-r--r--gcc/ada/rtsfind.adb4
-rw-r--r--gcc/ada/sem_ch4.adb25
4 files changed, 47 insertions, 10 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index ac3876e..b508915 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,21 @@
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.
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index d944ac9..d48544f 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 ecd1cd6..22abb9a 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 3931957..a03c465 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;
--------------------------------------------------