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.
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;