[Ada] Fix missing array bounds checking

gcc/ada/

	* ghost.adb: Add another special case where full analysis is
	needed. This bug is due to quirks in the way
	Mark_And_Set_Ghost_Assignment works (it happens very early,
	before name resolution is done).
This commit is contained in:
Bob Duff 2021-02-23 15:50:21 -05:00 committed by Pierre-Marie de Rodat
parent 663e6d7960
commit 1ac6fcf57c
1 changed files with 14 additions and 4 deletions

View File

@ -1245,11 +1245,21 @@ package body Ghost is
-- processing them in that mode can lead to spurious errors.
if Expander_Active then
-- Cases where full analysis is needed, involving array indexing
-- which would otherwise be missing array-bounds checks:
if not Analyzed (Orig_Lhs)
and then Nkind (Orig_Lhs) = N_Indexed_Component
and then Nkind (Prefix (Orig_Lhs)) = N_Selected_Component
and then Nkind (Prefix (Prefix (Orig_Lhs))) =
N_Indexed_Component
and then
((Nkind (Orig_Lhs) = N_Indexed_Component
and then Nkind (Prefix (Orig_Lhs)) = N_Selected_Component
and then Nkind (Prefix (Prefix (Orig_Lhs))) =
N_Indexed_Component)
or else
(Nkind (Orig_Lhs) = N_Selected_Component
and then Nkind (Prefix (Orig_Lhs)) = N_Indexed_Component
and then Nkind (Prefix (Prefix (Orig_Lhs))) =
N_Selected_Component
and then Nkind (Parent (N)) /= N_Loop_Statement))
then
Analyze (Orig_Lhs);
end if;