aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_ch6.adb
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2023-06-01 13:25:53 +0200
committerMarc Poulhiès <poulhies@adacore.com>2023-06-20 13:25:28 +0200
commit865c5db7cbc16de9887d5941be9a63a7fa03692e (patch)
tree71bb2d3b35732cb26ab66e3e0f775057f6d5fc1b /gcc/ada/sem_ch6.adb
parent31edd39bc418ccb6b806767ff5cbefd98fb81fb5 (diff)
downloadgcc-865c5db7cbc16de9887d5941be9a63a7fa03692e.zip
gcc-865c5db7cbc16de9887d5941be9a63a7fa03692e.tar.gz
gcc-865c5db7cbc16de9887d5941be9a63a7fa03692e.tar.bz2
ada: Further fixes to handling of private views in instances
This removes more bypasses for private views in instances that are present in type predicates (Conforming_Types, Covers, Specific_Type and Wrong_Type), which in exchange requires additional work in Sem_Ch12 to restore the proper view of types during the instantiation of generic bodies. The main mechanism for this is the Has_Private_View flag, but it comes with the limitations that 1) there must be a direct reference to the global type in the generic construct (either a reference to a global object of this type or the explicit declaration of a local object of this type), which is not always the case e.g. for loop parameters and 2) it can deal with a single type at a time, e.g. it cannot deal with an array type and its component type if their respective views are not the same in the instance. To overcome the second limitation, a new Has_Secondary_Private_View flag is introduced to deal with a secondary type, which as of this writing is either the component type of an array type or the designated type of an access type (together they make up the vast majority of the problematic cases for the Has_Private_View flag alone). This new mechanism subsumes a specific treatment for them that was added in Copy_Generic_Node a few years ago, although a specific treatment still needs to be preserved for comparison and equality operators in a narrower case. Additional handling is also introduced to overcome the first limitation for loop parameters in Copy_Generic_Node, and a relaxed condition is used in Exp_Ch7.Convert_View to generate an unchecked conversion between views. gcc/ada/ * exp_ch7.adb (Convert_View): Detect more cases of mismatches for private types and use Implementation_Base_Type as main criterion. * gen_il-fields.ads (Opt_Field_Enum): Add Has_Secondary_Private_View * gen_il-gen-gen_nodes.adb (N_Expanded_Name): Likewise. (N_Direct_Name): Likewise. (N_Op): Likewise. * sem_ch12.ads (Check_Private_View): Document the usage of second flag Has_Secondary_Private_View. * sem_ch12.adb (Get_Associated_Entity): New function to retrieve the ultimate associated entity, if any. (Check_Private_View): Implement Has_Secondary_Private_View support. (Copy_Generic_Node): Remove specific treatment for Component_Type of an array type and Designated_Type of an access type. Add specific treatment for comparison and equality operators, as well as iterator and loop parameter specifications. (Instantiate_Type): Implement Has_Secondary_Private_View support. (Requires_Delayed_Save): Call Get_Associated_Entity. (Set_Global_Type): Implement Has_Secondary_Private_View support. * sem_ch6.adb (Conforming_Types): Remove bypass for private views in instances. * sem_type.adb (Covers): Return true if Is_Subtype_Of does so. Remove bypass for private views in instances. (Specific_Type): Likewise. * sem_util.adb (Wrong_Type): Likewise. * sinfo.ads (Has_Secondary_Private_View): Document new flag.
Diffstat (limited to 'gcc/ada/sem_ch6.adb')
-rw-r--r--gcc/ada/sem_ch6.adb17
1 files changed, 5 insertions, 12 deletions
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 17c50f6..62ca985 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -8410,21 +8410,14 @@ package body Sem_Ch6 is
Ctype <= Mode_Conformant
or else Subtypes_Statically_Match (Type_1, Full_View (Type_2));
- elsif Is_Private_Type (Type_2)
- and then In_Instance
- and then Present (Full_View (Type_2))
- and then Base_Types_Match (Type_1, Full_View (Type_2))
- then
- return
- Ctype <= Mode_Conformant
- or else Subtypes_Statically_Match (Type_1, Full_View (Type_2));
-
- -- Another confusion between views in a nested instance with an
- -- actual private type whose full view is not in scope.
+ -- The subtype declared for the formal type in an instantiation and the
+ -- actual type are conforming. Note that testing Is_Generic_Actual_Type
+ -- here is not sufficient because the flag is only set in the bodies of
+ -- instances, which is too late for formal subprograms.
elsif Ekind (Type_2) = E_Private_Subtype
- and then In_Instance
and then Etype (Type_2) = Type_1
+ and then Present (Generic_Parent_Type (Declaration_Node (Type_2)))
then
return True;