https://gcc.gnu.org/g:70999668a1305571d3b5fc57168fcb060a976418

commit r15-5406-g70999668a1305571d3b5fc57168fcb060a976418
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Sun Nov 10 19:20:13 2024 +0100

    ada: Fix interaction of aspect Predicate and static case expressions
    
    The semantics of the GNAT-specific Predicate aspect should be equivalent
    to those of the Static_Predicate aspect when the predicate expression is
    static, but that is not correctly implemented for static case expressions.
    
    gcc/ada/ChangeLog:
    
            * exp_ch4.adb (Expand_N_Case_Expression): Remove the test on
            enclosing predicate function for the return optimization.
            Rewrite it in the general case to catch all nondynamic predicates.
            (Expand_N_If_Expression): Remove the test on enclosing predicate
            function for the return optimization.

Diff:
---
 gcc/ada/exp_ch4.adb | 43 ++++++++++++++++++-------------------------
 1 file changed, 18 insertions(+), 25 deletions(-)

diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index 9e82b78e3b6b..5ae2d11b04c1 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -4989,17 +4989,13 @@ package body Exp_Ch4 is
    ------------------------------
 
    procedure Expand_N_Case_Expression (N : Node_Id) is
-      Loc : constant Source_Ptr := Sloc (N);
-      Par : constant Node_Id    := Parent (N);
-      Typ : constant Entity_Id  := Etype (N);
-
-      In_Predicate : constant Boolean :=
-        Ekind (Current_Scope) in E_Function | E_Procedure
-          and then Is_Predicate_Function (Current_Scope);
-      --  Flag set when the case expression appears within a predicate
+      Loc  : constant Source_Ptr := Sloc (N);
+      Par  : constant Node_Id    := Parent (N);
+      Scop : constant Entity_Id  := Current_Scope;
+      Typ  : constant Entity_Id  := Etype (N);
 
       Optimize_Return_Stmt : constant Boolean :=
-        Nkind (Par) = N_Simple_Return_Statement and then not In_Predicate;
+        Nkind (Par) = N_Simple_Return_Statement;
       --  Small optimization: when the case expression appears in the context
       --  of a simple return statement, expand into
 
@@ -5012,8 +5008,7 @@ package body Exp_Ch4 is
       --    end case;
 
       --  This makes the expansion much easier when expressions are calls to
-      --  a BIP function. But do not perform it when the return statement is
-      --  within a predicate function, as this causes spurious errors.
+      --  build-in-place functions.
 
       function Is_Copy_Type (Typ : Entity_Id) return Boolean;
       --  Return True if we can copy objects of this type when expanding a case
@@ -5081,13 +5076,17 @@ package body Exp_Ch4 is
          return;
       end if;
 
-      --  If the case expression is a predicate specification, and the type
-      --  to which it applies has a static predicate aspect, do not expand,
-      --  because it will be converted to the proper predicate form later.
+      --  If the case expression is a predicate specification, do not expand
+      --  because it will need to be recognized and converted to the canonical
+      --  predicate form later if it it happens to be static.
 
-      if In_Predicate
-        and then
-          Has_Static_Predicate_Aspect (Etype (First_Entity (Current_Scope)))
+      if Ekind (Scop) in E_Function | E_Procedure
+        and then Is_Predicate_Function (Scop)
+        and then Is_Entity_Name (Expression (N))
+        and then Entity (Expression (N)) = First_Entity (Scop)
+        and then (Is_Scalar_Type (Etype (Expression (N)))
+                   or else Is_String_Type (Etype (Expression (N))))
+        and then not Has_Dynamic_Predicate_Aspect (Etype (Expression (N)))
       then
          return;
       end if;
@@ -5471,13 +5470,8 @@ package body Exp_Ch4 is
       Par   : constant Node_Id    := Parent (N);
       Typ   : constant Entity_Id  := Etype (N);
 
-      In_Predicate : constant Boolean :=
-        Ekind (Current_Scope) in E_Function | E_Procedure
-          and then Is_Predicate_Function (Current_Scope);
-      --  Flag set when the if expression appears within a predicate
-
       Optimize_Return_Stmt : constant Boolean :=
-        Nkind (Par) = N_Simple_Return_Statement and then not In_Predicate;
+        Nkind (Par) = N_Simple_Return_Statement;
       --  Small optimization: when the if expression appears in the context of
       --  a simple return statement, expand into
 
@@ -5488,8 +5482,7 @@ package body Exp_Ch4 is
       --    end if;
 
       --  This makes the expansion much easier when expressions are calls to
-      --  a BIP function. But do not perform it when the return statement is
-      --  within a predicate function, as this causes spurious errors.
+      --  build-in-place functions.
 
       Force_Expand : constant Boolean := Is_Anonymous_Access_Actual (N);
       --  Determine if we are dealing with a special case of a conditional

Reply via email to