]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Ada] Properly handle unprefixed references to components
authorSteve Baird <baird@adacore.com>
Wed, 15 Dec 2021 23:13:39 +0000 (15:13 -0800)
committerPierre-Marie de Rodat <derodat@adacore.com>
Mon, 9 May 2022 09:27:34 +0000 (09:27 +0000)
In some cases, the compiler would incorrectly reject unprefixed uses of
component names in an aspect specification for the composite type.
Correct this error.

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.

gcc/ada/sem_ch13.adb

index 78415e666f4d8a7dad97ce0af27722fe21a14bad..b29b1db6ff1f3200d572e3096b3422881a7ee2e3 100644 (file)
@@ -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;