[Ada] Spurious constraint error on conversion of access types
authorJustin Squirek <squirek@adacore.com>
Fri, 15 Jan 2021 15:59:49 +0000 (10:59 -0500)
committerPierre-Marie de Rodat <derodat@adacore.com>
Thu, 6 May 2021 07:51:30 +0000 (03:51 -0400)
gcc/ada/

* checks.adb (Make_Discriminant_Constraint_Check): Add check for
null when the type being converted is an access type.

gcc/ada/checks.adb

index a4ad4e6..6487944 100644 (file)
@@ -3658,6 +3658,20 @@ package body Checks is
          Cond := Build_Discriminant_Checks (Expr, Expr_Type);
          Set_Discriminant_Constraint (Expr_Type, Old_Constraints);
 
+         --  Conversion between access types requires that we check for null
+         --  before checking discriminants.
+
+         if Is_Access_Type (Etype (Expr)) then
+            Cond := Make_And_Then (Loc,
+                      Left_Opnd  =>
+                        Make_Op_Ne (Loc,
+                          Left_Opnd  =>
+                            Duplicate_Subexpr_No_Checks
+                              (Expr, Name_Req => True),
+                          Right_Opnd => Make_Null (Loc)),
+                      Right_Opnd => Cond);
+         end if;
+
          Insert_Action (N,
            Make_Raise_Constraint_Error (Loc,
              Condition => Cond,