[Ada] AI12-0204 Renaming of a prefixed view

Message ID 20200608080043.GA90475@adacore.com
State New
Headers show
Series
  • [Ada] AI12-0204 Renaming of a prefixed view
Related show

Commit Message

Pierre-Marie de Rodat June 8, 2020, 8 a.m.
AI12-0204 clarified that the prefix of a prefixed view that is renamed
or passed as a formal subprogram must be renamable as an object and
similarly (was already checked by GNAT), the prefix of a prefixed view
that has an implicit 'Access must be legal for 'Access and a
generalized_indexing is illegal if the equivalent prefixed view is
illegal.

Tested on x86_64-pc-linux-gnu, committed on trunk

2020-06-08  Arnaud Charlet  <charlet@adacore.com>

gcc/ada/

	* sem_ch5.adb: Fix typo.
	* sem_ch8.adb (Analyze_Renamed_Primitive_Operation): Check that
	the prefix of a prefixed view must be renamable as an object.

Patch

--- gcc/ada/sem_ch5.adb
+++ gcc/ada/sem_ch5.adb
@@ -2390,7 +2390,7 @@  package body Sem_Ch5 is
             --  AI12-0047 stipulates that the domain (array or container)
             --  cannot be a component that depends on a discriminant if the
             --  enclosing object is mutable, to prevent a modification of the
-            --  dowmain of iteration in the course of an iteration.
+            --  domain of iteration in the course of an iteration.
 
             --  If the object is an expression it has been captured in a
             --  temporary, so examine original node.

--- gcc/ada/sem_ch8.adb
+++ gcc/ada/sem_ch8.adb
@@ -1826,6 +1826,7 @@  package body Sem_Ch8 is
       Is_Body : Boolean)
    is
       Old_S : Entity_Id;
+      Nam   : Entity_Id;
 
       function Conforms
         (Subp : Entity_Id;
@@ -1902,7 +1903,7 @@  package body Sem_Ch8 is
       end if;
 
       if Old_S = Any_Id then
-         Error_Msg_N (" no subprogram or entry matches specification",  N);
+         Error_Msg_N ("no subprogram or entry matches specification",  N);
 
       else
          if Is_Body then
@@ -1920,6 +1921,21 @@  package body Sem_Ch8 is
                Error_Msg_N ("mode conformance error in renaming", N);
             end if;
 
+            --  AI12-0204: The prefix of a prefixed view that is renamed or
+            --  passed as a formal subprogram must be renamable as an object.
+
+            Nam := Prefix (Name (N));
+
+            if Is_Object_Reference (Nam) then
+               if Is_Dependent_Component_Of_Mutable_Object (Nam) then
+                  Error_Msg_N
+                    ("illegal renaming of discriminant-dependent component",
+                     Nam);
+               end if;
+            else
+               Error_Msg_N ("expect object name in renaming", Nam);
+            end if;
+
             --  Enforce the rule given in (RM 6.3.1 (10.1/2)): a prefixed
             --  view of a subprogram is intrinsic, because the compiler has
             --  to generate a wrapper for any call to it. If the name in a