Commit 41306c0a by Ed Schonberg Committed by Pierre-Marie de Rodat

[Ada] Spurious ambiguity error on call returning an access type

If F is a function with a single defaulted parameter that returns an
access_to_array type, then F (I) may designate either the return type or
an indexing of the result of the call, after implicit dereferencing.  If
the component type C of the array type AR is accces AR this is ambiguous
in a context whose expected type is C. If F is parameterless the call is
not ambiguous.

2018-08-21  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_res.adb (Resolve_Call): Resolve correctly a parameterless
	call that returns an access type whose designated type is the
	component type of an array, when the function has no defaulted
	parameters.

gcc/testsuite/

	* gnat.dg/access5.adb, gnat.dg/access5.ads: New testcase.

From-SVN: r263726
parent 298e0c6b
2018-08-21 Ed Schonberg <schonberg@adacore.com>
* sem_res.adb (Resolve_Call): Resolve correctly a parameterless
call that returns an access type whose designated type is the
component type of an array, when the function has no defaulted
parameters.
2018-08-21 Yannick Moy <moy@adacore.com>
* doc/gnat_ugn/building_executable_programs_with_gnat.rst:
......
......@@ -6128,7 +6128,18 @@ package body Sem_Res is
Ret_Type : constant Entity_Id := Etype (Nam);
begin
if Is_Access_Type (Ret_Type)
-- If this is a parameterless call there is no ambiguity
-- and the call has the type of the function.
if No (First_Actual (N)) then
Set_Etype (N, Etype (Nam));
if Present (First_Formal (Nam)) then
Resolve_Actuals (N, Nam);
end if;
Build_Call_Marker (N);
elsif Is_Access_Type (Ret_Type)
and then Ret_Type = Component_Type (Designated_Type (Ret_Type))
then
Error_Msg_N
......
2018-08-21 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/access5.adb, gnat.dg/access5.ads: New testcase.
2018-08-21 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/rep_clause7.adb: New testcase.
......
-- { dg-do compile }
package body Access5 is
procedure Dummy is null;
end;
package Access5 is
type Vec;
type Ptr is access all Vec;
type Vec is array (1..3) of Ptr;
function F return Ptr;
pragma Import (Ada, F);
Tail : Vec := (F, F, F);
procedure Dummy;
end;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment