diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 08a4ef41d5f..ca023c20eea 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2016-04-19 Eric Botcazou + + * sem_ch6.adb (Possible_Freeze): If the type is an incomplete + CW type, then the subprogram must have a delayed freeze. This + ensures that the backend can properly recover the full view when + elaborating the access subprogram declaration. + 2016-04-19 Ed Schonberg * sem_attr.adb (Resolve_Attribute, case 'Access): Freeze diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 17e9fe19fe9..2fec97c49c0 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -5251,8 +5251,9 @@ package body Sem_Ch6 is -- T is the type of either a formal parameter or of the return type. -- If T is not yet frozen and needs a delayed freeze, then the -- subprogram itself must be delayed. If T is the limited view of an - -- incomplete type the subprogram must be frozen as well, because - -- T may depend on local types that have not been frozen yet. + -- incomplete type (or of a CW type thereof) the subprogram must be + -- frozen as well, because T may depend on local types that have not + -- been frozen yet. --------------------- -- Possible_Freeze -- @@ -5269,7 +5270,8 @@ package body Sem_Ch6 is then Set_Has_Delayed_Freeze (Designator); - elsif Ekind (T) = E_Incomplete_Type + elsif (Ekind (T) = E_Incomplete_Type + or else Ekind (T) = E_Class_Wide_Type) and then From_Limited_With (T) then Set_Has_Delayed_Freeze (Designator);