From 1c37d1960adf1c30fa700b89d588182c84f8f22d Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Thu, 12 Aug 2021 10:39:21 -0400 Subject: [PATCH] [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. --- gcc/ada/sem_attr.adb | 4 +++- gcc/ada/sem_ch5.adb | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index 7b6dc21b6f0b..4265df6b8c02 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 63bb80c12914..45d24574c28f 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 -- 2.47.2