diff options
author | Bob Duff <duff@adacore.com> | 2021-02-23 15:50:21 -0500 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-06-16 04:42:59 -0400 |
commit | 1ac6fcf57c55ec2cac914b64d5d56a341a5aa4f0 (patch) | |
tree | 7075d7dcfcb0b48281fa087413cb0406673c44c3 /gcc | |
parent | 663e6d7960199559ebd3107a28ea1cfda3e5be00 (diff) | |
download | gcc-1ac6fcf57c55ec2cac914b64d5d56a341a5aa4f0.zip gcc-1ac6fcf57c55ec2cac914b64d5d56a341a5aa4f0.tar.gz gcc-1ac6fcf57c55ec2cac914b64d5d56a341a5aa4f0.tar.bz2 |
[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).
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ghost.adb | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/gcc/ada/ghost.adb b/gcc/ada/ghost.adb index f95bd19..42ea0f5 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; |