https://gcc.gnu.org/g:297241e4ac2ac36986cbf487048908591e22c1b8

commit r16-3702-g297241e4ac2ac36986cbf487048908591e22c1b8
Author: Viljar Indus <in...@adacore.com>
Date:   Tue Aug 5 16:16:04 2025 +0300

    ada: Improve error message in the case of missing indices
    
    When both a missing index and an out of bounds error are present then
    we should also mention the error on out of bounds index as it suggests
    removing the index that is out of bounds rather than suggesting adding
    indices that are also out of bounds.
    
    gcc/ada/ChangeLog:
    
            * sem_aggr.adb (Resolve_Array_Aggregate): Indicate an out of
            bounds index error also in the case of a missing index.

Diff:
---
 gcc/ada/sem_aggr.adb | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb
index 58460b8e3bb8..bbd0eaefb98e 100644
--- a/gcc/ada/sem_aggr.adb
+++ b/gcc/ada/sem_aggr.adb
@@ -3331,6 +3331,24 @@ package body Sem_Aggr is
                      --  Not needed if others, since missing impossible.
 
                      if No (Others_N) then
+                        --  We are dealing with a gap in the indicies. However
+                        --  we should also check for an out of bounds error. If
+                        --  there exists an out of bounds error then we should
+                        --  not be suggesting that the user should add the
+                        --  missing indices but rather remove the ones that are
+                        --  out of bounds.
+
+                        Aggr_Low := Table (1).Lo;
+                        Aggr_High := Table (Nb_Discrete_Choices).Hi;
+
+                        Check_Bounds
+                          (Index_Typ_Low, Index_Typ_High, Aggr_Low, Aggr_High);
+                        Check_Bounds
+                          (Index_Base_Low,
+                           Index_Base_High,
+                           Aggr_Low,
+                           Aggr_High);
+
                         for J in 2 .. Nb_Discrete_Choices loop
                            Lo_Val := Expr_Value (Table (J).Lo);
                            Hi_Val := Table (J - 1).Highest;
@@ -3358,11 +3376,13 @@ package body Sem_Aggr is
                                  if Hi_Val + 1 = Lo_Val - 1 then
                                     Error_Msg_N
                                       ("missing index value "
-                                       & "in array aggregate!", Error_Node);
+                                       & "in array aggregate!",
+                                       Error_Node);
                                  else
                                     Error_Msg_N
                                       ("missing index values "
-                                       & "in array aggregate!", Error_Node);
+                                       & "in array aggregate!",
+                                       Error_Node);
                                  end if;
 
                                  Output_Bad_Choices

Reply via email to