When extended return statement declares object using an explicit subtype
indication, then it is better to recover the original unconstrained type using
the explicit subtype indication. This appears to be necessary for subtypes with
predicates.
gcc/ada/ChangeLog:
* sem_ch3.adb (Check_Return_Subtype_Indication): Use type from
explicit subtype indication, when possible.
-- to recover the nominal unconstrained type.
if Is_Constr_Subt_For_U_Nominal (Obj_Typ) then
- Obj_Typ := Etype (Obj_Typ);
+ if Nkind (Object_Definition (Obj_Decl)) = N_Subtype_Indication then
+ Obj_Typ := Entity (Subtype_Mark (Object_Definition (Obj_Decl)));
+ else
+ Obj_Typ := Etype (Obj_Typ);
+ end if;
pragma Assert (not Is_Constrained (Obj_Typ));
end if;