else
if not Is_Copy_Type (Typ) then
- Alt_Expr :=
- Make_Attribute_Reference (Alt_Loc,
- Prefix => Relocate_Node (Alt_Expr),
- Attribute_Name => Name_Unrestricted_Access);
+ -- It's possible that a call to Apply_Length_Check in
+ -- Resolve_Case_Expression rewrote the dependent expression
+ -- into a N_Raise_Constraint_Error. If that's the case, we
+ -- don't create a reference to Unrestricted_Access, but we
+ -- update the type of the N_Raise_Constraint_Error node.
+
+ if Nkind (Alt_Expr) in N_Raise_Constraint_Error then
+ Set_Etype (Alt_Expr, Target_Typ);
+ else
+ Alt_Expr :=
+ Make_Attribute_Reference (Alt_Loc,
+ Prefix => Relocate_Node (Alt_Expr),
+ Attribute_Name => Name_Unrestricted_Access);
+ end if;
end if;
LHS := New_Occurrence_Of (Target, Loc);
if Is_Scalar_Type (Alt_Typ) and then Alt_Typ /= Typ then
Rewrite (Alt_Expr, Convert_To (Typ, Alt_Expr));
Analyze_And_Resolve (Alt_Expr, Typ);
+
+ elsif Is_Array_Type (Typ) then
+ Apply_Length_Check (Alt_Expr, Typ);
end if;
Next (Alt);