[Ada] Properly handle unprefixed references to components

Message ID 20220509093026.GA3184372@adacore.com
State Committed
Headers
Series [Ada] Properly handle unprefixed references to components |

Commit Message

Pierre-Marie de Rodat May 9, 2022, 9:30 a.m. UTC
  In some cases, the compiler would incorrectly reject unprefixed uses of
component names in an aspect specification for the composite type.
Correct this error.

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

gcc/ada/

	* sem_ch13.adb (Replace_Type_Ref): In the case of an identifier
	that names a component of the type, simplify the test to decide
	whether to build a prefix for it (the prefix denotes the current
	instance of the enclosing type): if the identifier doesn't
	already have a prefix, then give it one. This isn't quite right
	in the corner case of a quantified expression or some other such
	expression that declares an object with the same name as a
	component, but it is still an improvement.
  

Patch

diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -15176,27 +15176,26 @@  package body Sem_Ch13 is
                end if;
 
                --  The components of the type are directly visible and can
-               --  be referenced without a prefix.
-
-               if Nkind (Parent (N)) = N_Selected_Component then
-                  null;
-
-               --  In expression C (I), C may be a directly visible function
-               --  or a visible component that has an array type. Disambiguate
-               --  by examining the component type.
+               --  be referenced in the source code without a prefix.
+               --  If a name denoting a component doesn't already have a
+               --  prefix, then normalize it by adding a reference to the
+               --  current instance of the type as a prefix.
+               --
+               --  This isn't right in the pathological corner case of an
+               --  object-declaring expression (e.g., a quantified expression
+               --  or a declare expression) that declares an object with the
+               --  same name as a visible component declaration, thereby hiding
+               --  the component within that expression. For example, given a
+               --  record with a Boolean component "C" and a dynamic predicate
+               --  "C = (for some C in Character => Some_Function (C))", only
+               --  the first of the two uses of C should have a prefix added
+               --  here; instead, both will get prefixes.
 
-               elsif Nkind (Parent (N)) = N_Indexed_Component
-                 and then N = Prefix (Parent (N))
+               if Nkind (Parent (N)) /= N_Selected_Component
+                 or else N /= Selector_Name (Parent (N))
                then
                   Comp := Visible_Component (Chars (N));
 
-                  if Present (Comp) and then Is_Array_Type (Etype (Comp)) then
-                     Add_Prefix (N, Comp);
-                  end if;
-
-               else
-                  Comp := Visible_Component (Chars (N));
-
                   if Present (Comp) then
                      Add_Prefix (N, Comp);
                   end if;