From c50041b99bc621cc1e2c7b7dbb67c0600926072e Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Wed, 17 Feb 2021 23:32:25 +0100 Subject: [PATCH] [Ada] Reorder code for validity checks of unchecked conversions gcc/ada/ * sem_ch13.adb (Validate_Unchecked_Conversion): Move detection of generic types before switching to their private views; fix style in using AND THEN. --- gcc/ada/sem_ch13.adb | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index a9770db6b61..8aa62c89deb 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -16578,18 +16578,7 @@ package body Sem_Ch13 is -- here because the processing for generic instantiation always makes -- subtypes, and we want the original frozen actual types. - -- If we are dealing with private types, then do the check on their - -- fully declared counterparts if the full declarations have been - -- encountered (they don't have to be visible, but they must exist). - Source := Ancestor_Subtype (Etype (First_Formal (Act_Unit))); - - if Is_Private_Type (Source) - and then Present (Underlying_Type (Source)) - then - Source := Underlying_Type (Source); - end if; - Target := Ancestor_Subtype (Etype (Act_Unit)); -- If either type is generic, the instantiation happens within a generic @@ -16600,6 +16589,16 @@ package body Sem_Ch13 is return; end if; + -- If we are dealing with private types, then do the check on their + -- fully declared counterparts if the full declarations have been + -- encountered (they don't have to be visible, but they must exist). + + if Is_Private_Type (Source) + and then Present (Underlying_Type (Source)) + then + Source := Underlying_Type (Source); + end if; + if Is_Private_Type (Target) and then Present (Underlying_Type (Target)) then @@ -16692,8 +16691,8 @@ package body Sem_Ch13 is -- in the same unit as the unchecked conversion, then set the flag -- No_Strict_Aliasing (no strict aliasing is implicit here) - if Is_Access_Type (Target) and then - In_Same_Source_Unit (Target, N) + if Is_Access_Type (Target) + and then In_Same_Source_Unit (Target, N) then Set_No_Strict_Aliasing (Implementation_Base_Type (Target)); end if;