[Ada] Properly handle unprefixed references to components

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.
This commit is contained in:
Steve Baird 2021-12-15 15:13:39 -08:00 committed by Pierre-Marie de Rodat
parent 09cca56d66
commit ea7967ebdf

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