From 41306c0a89a539c97e8eee0867816ea3ae5ab5b7 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Tue, 21 Aug 2018 14:47:32 +0000 Subject: [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 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 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/sem_res.adb | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'gcc/ada') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 0c558c0..5ac1463 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2018-08-21 Ed Schonberg + + * 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 * doc/gnat_ugn/building_executable_programs_with_gnat.rst: diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 13612aa..5a1a9f7 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -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 -- cgit v1.1