[Ada] Spurious ambiguity error on call returning an access type
authorEd Schonberg <schonberg@adacore.com>
Tue, 21 Aug 2018 14:47:32 +0000 (14:47 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 21 Aug 2018 14:47:32 +0000 (14:47 +0000)
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

gcc/ada/ChangeLog
gcc/ada/sem_res.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/access5.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/access5.ads [new file with mode: 0644]

index 0c558c0cb060aadee6c49a924363d620ccfc6dc7..5ac14639231de32b2adf50141e364cb63345ffc0 100644 (file)
@@ -1,3 +1,10 @@
+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:
index 13612aa3bf53cf553e9eca512f0ad6afc73ac5ad..5a1a9f7d4e3515cefb01891621163d6503a54f77 100644 (file)
@@ -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
index e0dfb3db38cee07b8daf0da45578de03fc39a994..eccca9b0349de9bec4b7b66aed1c8817358a0423 100644 (file)
@@ -1,3 +1,7 @@
+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.
diff --git a/gcc/testsuite/gnat.dg/access5.adb b/gcc/testsuite/gnat.dg/access5.adb
new file mode 100644 (file)
index 0000000..1369ea0
--- /dev/null
@@ -0,0 +1,5 @@
+--  { dg-do compile }
+
+package body Access5 is
+  procedure Dummy is null;
+end;
diff --git a/gcc/testsuite/gnat.dg/access5.ads b/gcc/testsuite/gnat.dg/access5.ads
new file mode 100644 (file)
index 0000000..81ab3b3
--- /dev/null
@@ -0,0 +1,10 @@
+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;