diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb index caa9153fd04c6d8ef7b7fbc00bb67eae0ddcda8c..396027d39b4a0d2241e4af7d12f45f6b42bb02ab 100644 --- a/gcc/ada/sem_eval.adb +++ b/gcc/ada/sem_eval.adb @@ -3927,15 +3927,30 @@ package body Sem_Eval is elsif Has_Discriminants (T1) or else Has_Discriminants (T2) then - -- We really need comments here ??? + -- Because of view exchanges in multiple instantiations, conformance + -- checking might try to match a partial view of a type with no + -- discriminants with a full view that has defaulted discriminants. + -- In such a case, use the discriminant constraint of the full view, + -- which must exist because we know that the two subtypes have the + -- same base type. if Has_Discriminants (T1) /= Has_Discriminants (T2) then - if In_Instance - and then Is_Private_Type (T2) - and then Present (Full_View (T2)) - and then Has_Discriminants (Full_View (T2)) - then - return Subtypes_Statically_Match (T1, Full_View (T2)); + if In_Instance then + if Is_Private_Type (T2) + and then Present (Full_View (T2)) + and then Has_Discriminants (Full_View (T2)) + then + return Subtypes_Statically_Match (T1, Full_View (T2)); + + elsif Is_Private_Type (T1) + and then Present (Full_View (T1)) + and then Has_Discriminants (Full_View (T1)) + then + return Subtypes_Statically_Match (Full_View (T1), T2); + + else + return False; + end if; else return False; end if;