[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:
parent
09cca56d66
commit
ea7967ebdf
1 changed files with 16 additions and 17 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue