diff options
author | Ed Schonberg <schonberg@adacore.com> | 2009-04-17 13:40:20 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2009-04-17 15:40:20 +0200 |
commit | 054275e427bf1fd088708a2874daf993f10207db (patch) | |
tree | 42f1c27662323a3881c354473fa61ab1836f4416 /gcc/ada | |
parent | aed6fda81baff76d645be701b8bff8c458498745 (diff) | |
download | gcc-054275e427bf1fd088708a2874daf993f10207db.zip gcc-054275e427bf1fd088708a2874daf993f10207db.tar.gz gcc-054275e427bf1fd088708a2874daf993f10207db.tar.bz2 |
sem_ch3.adb (Build_Derived_Enumeration_Type): Diagnose properly illegal constraints on type derived from formal discrete types.
2009-04-17 Ed Schonberg <schonberg@adacore.com>
* sem_ch3.adb (Build_Derived_Enumeration_Type): Diagnose properly
illegal constraints on type derived from formal discrete types.
From-SVN: r146268
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/sem_ch3.adb | 50 |
2 files changed, 39 insertions, 16 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e948e79..f13a1f0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2009-04-17 Ed Schonberg <schonberg@adacore.com> + + * sem_ch3.adb (Build_Derived_Enumeration_Type): Diagnose properly + illegal constraints on type derived from formal discrete types. + 2009-04-17 Thomas Quinot <quinot@adacore.com> PR ada/35953 diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index e6be49e..7374b97 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -4033,8 +4033,12 @@ package body Sem_Ch3 is -- pre-allocate a freeze node, and set the proper link to the first -- subtype. Freeze_Entity will use this preallocated freeze node when -- it freezes the entity. + -- This does not apply if the base type is a generic type, whose + -- declaration is independent of the current derived definition. - if B /= T then + if B /= T + and then not Is_Generic_Type (B) + then Ensure_Freeze_Node (B); Set_First_Subtype_Link (Freeze_Node (B), T); end if; @@ -5055,22 +5059,36 @@ package body Sem_Ch3 is Hi : Node_Id; begin - Lo := - Make_Attribute_Reference (Loc, - Attribute_Name => Name_First, - Prefix => New_Reference_To (Derived_Type, Loc)); - Set_Etype (Lo, Derived_Type); + if Nkind (Indic) /= N_Subtype_Indication then + Lo := + Make_Attribute_Reference (Loc, + Attribute_Name => Name_First, + Prefix => New_Reference_To (Derived_Type, Loc)); + Set_Etype (Lo, Derived_Type); + + Hi := + Make_Attribute_Reference (Loc, + Attribute_Name => Name_Last, + Prefix => New_Reference_To (Derived_Type, Loc)); + Set_Etype (Hi, Derived_Type); + + Set_Scalar_Range (Derived_Type, + Make_Range (Loc, + Low_Bound => Lo, + High_Bound => Hi)); + else - Hi := - Make_Attribute_Reference (Loc, - Attribute_Name => Name_Last, - Prefix => New_Reference_To (Derived_Type, Loc)); - Set_Etype (Hi, Derived_Type); - - Set_Scalar_Range (Derived_Type, - Make_Range (Loc, - Low_Bound => Lo, - High_Bound => Hi)); + -- Analyze subtype indication and verify compatibility + -- with parent type. + + if + Base_Type + (Process_Subtype (Indic, N)) /= Base_Type (Parent_Type) + then + Error_Msg_N + ("illegal constraint for formal discrete type", N); + end if; + end if; end; else |