[Ada] Properly handle unprefixed references to components
Commit Message
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.
@@ -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;