https://gcc.gnu.org/g:33541b880694fedb901cf8f38b2be77e4c429068

commit r15-457-g33541b880694fedb901cf8f38b2be77e4c429068
Author: Steve Baird <ba...@adacore.com>
Date:   Fri Feb 9 15:08:51 2024 -0800

    ada: Better error message for bad general case statements
    
    If -gnatX0 is specified, we allow case statements with a selector
    expression of a record or array type, but not of a private type.
    If the selector expression is of a private type then we should generate
    an appropriate error message instead of a bugbox.
    
    gcc/ada/
    
            * sem_ch5.adb (Analyze_Case_Statement): Emit a message and return
            early in the case where general case statements are allowed but
            the selector expression is of a private type. This is done to
            avoid a bugbox.

Diff:
---
 gcc/ada/sem_ch5.adb | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
index 2677a2c5a1cc..65370ebfe7ea 100644
--- a/gcc/ada/sem_ch5.adb
+++ b/gcc/ada/sem_ch5.adb
@@ -1497,6 +1497,15 @@ package body Sem_Ch5 is
          Resolve (Exp, Etype (Exp));
          Exp_Type := Etype (Exp);
          Is_General_Case_Statement := True;
+         if not (Is_Record_Type (Exp_Type) or Is_Array_Type (Exp_Type)) then
+            Error_Msg_N
+              ("selecting expression of general case statement " &
+               "must be a record or an array",
+               Exp);
+
+            --  Avoid cascading errors
+            return;
+         end if;
       else
          Analyze_And_Resolve (Exp, Any_Discrete);
          Exp_Type := Etype (Exp);

Reply via email to