aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2021-08-12 10:39:21 -0400
committerPierre-Marie de Rodat <derodat@adacore.com>2021-10-01 06:13:38 +0000
commit1c37d1960adf1c30fa700b89d588182c84f8f22d (patch)
treeb9b460c44b739fc259cadfc2d07c7fe05a3872b2 /gcc
parent10ca293141e0e8178de6d68473bd2ac607c6348b (diff)
downloadgcc-1c37d1960adf1c30fa700b89d588182c84f8f22d.zip
gcc-1c37d1960adf1c30fa700b89d588182c84f8f22d.tar.gz
gcc-1c37d1960adf1c30fa700b89d588182c84f8f22d.tar.bz2
[Ada] Crash on improper use of GNAT attribute Type_Key
gcc/ada/ * sem_attr.adb (Analyze_Attribute, case Type_Key): Attribute can be applied to a formal type. * sem_ch5.adb (Analyze_Case_Statement): If Extensions_Allowed is not enabled, verify that the type of the expression is discrete.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_attr.adb4
-rw-r--r--gcc/ada/sem_ch5.adb7
2 files changed, 10 insertions, 1 deletions
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 7b6dc21..4265df6 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -6643,7 +6643,9 @@ package body Sem_Attr is
Initialize (CRC);
Compute_Type_Key (Entity (P));
- if not Is_Frozen (Entity (P)) then
+ if not Is_Frozen (Entity (P))
+ and then not Is_Generic_Type (Entity (P))
+ then
Error_Msg_N ("premature usage of Type_Key?", N);
end if;
diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
index 63bb80c..45d2457 100644
--- a/gcc/ada/sem_ch5.adb
+++ b/gcc/ada/sem_ch5.adb
@@ -1681,6 +1681,13 @@ package body Sem_Ch5 is
Error_Msg_N
("(Ada 83) case expression cannot be of a generic type", Exp);
return;
+
+ elsif not Extensions_Allowed
+ and then not Is_Discrete_Type (Exp_Type)
+ then
+ Error_Msg_N
+ ("expression in case statement must be of a discrete_Type", Exp);
+ return;
end if;
-- If the case expression is a formal object of mode in out, then treat