With This patch the compiler properly rejects a subprogram body whose
signature is type conformant with a previous expression function in
the same scope.
Compiling same_signature,adb must yield:
same_signature.adb:8:04: body conflicts with expression function at line 5
---
with Ada.Text_IO; use Ada.Text_IO;
procedure Same_Signature is
function My_Add (A, B : Integer) return Integer
is (A - B);
function My_Add (A, B : Integer) return Integer is
begin
return A + B;
end My_Add;
begin
Put_Line (My_Add (5, 6)'Img);
end Same_Signature;
Tested on x86_64-pc-linux-gnu, committed on trunk
2015-10-26 Ed Schonberg <[email protected]>
* sem_ch6.adb (Find_Corresponding_Spec): Reject a subprogram
body whose signature is type conformant with a previous expression
function.
Index: sem_ch6.adb
===================================================================
--- sem_ch6.adb (revision 229321)
+++ sem_ch6.adb (working copy)
@@ -7310,6 +7310,19 @@
then
return E;
+ -- Expression functions can be completions, but cannot be
+ -- completed by an explicit body.
+
+ elsif Comes_From_Source (E)
+ and then Comes_From_Source (N)
+ and then Nkind (N) = N_Subprogram_Body
+ and then Nkind (Original_Node (Unit_Declaration_Node (E))) =
+ N_Expression_Function
+ then
+ Error_Msg_Sloc := Sloc (E);
+ Error_Msg_N ("body conflicts with expression function#", N);
+ return Empty;
+
elsif not Has_Completion (E) then
if Nkind (N) /= N_Subprogram_Body_Stub then
Set_Corresponding_Spec (N, E);