aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteve Baird <baird@adacore.com>2024-02-09 15:08:51 -0800
committerMarc Poulhiès <poulhies@adacore.com>2024-05-14 10:19:54 +0200
commit33541b880694fedb901cf8f38b2be77e4c429068 (patch)
tree7f1535c74c9e214f15d2c38df958683166de1e8b /gcc
parent416e572edb0cbc84081de5a1932be7a2138a529a (diff)
downloadgcc-33541b880694fedb901cf8f38b2be77e4c429068.zip
gcc-33541b880694fedb901cf8f38b2be77e4c429068.tar.gz
gcc-33541b880694fedb901cf8f38b2be77e4c429068.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_ch5.adb9
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
index 2677a2c..65370eb 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);