From 1ac6fcf57c55ec2cac914b64d5d56a341a5aa4f0 Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Tue, 23 Feb 2021 15:50:21 -0500 Subject: [PATCH] [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). --- gcc/ada/ghost.adb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ghost.adb b/gcc/ada/ghost.adb index f95bd19c5045..42ea0f52cf33 100644 --- a/gcc/ada/ghost.adb +++ b/gcc/ada/ghost.adb @@ -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; -- 2.47.2