public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-5914] ada: Error compiling reduction expression with overloaded reducer subprogram
@ 2023-11-28  9:38 Marc Poulhi?s
  0 siblings, 0 replies; only message in thread
From: Marc Poulhi?s @ 2023-11-28  9:38 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:348cb1c0158fd4c54cd4176be97f5ab9bec3afb9

commit r14-5914-g348cb1c0158fd4c54cd4176be97f5ab9bec3afb9
Author: Steve Baird <baird@adacore.com>
Date:   Tue Nov 14 12:06:36 2023 -0800

    ada: Error compiling reduction expression with overloaded reducer subprogram
    
    In some cases involving a reduction expression with an overloaded reducer
    subprogram, the accumulator type is not determined correctly. This can lead
    to spurious compile-time errors.
    
    gcc/ada/
    
            * exp_attr.adb (Expand_N_Attribute_Reference): In the case of a
            Reduce attribute reference, fix bugs in initializing Accum_Typ.
            The previous version was incorrect in the case where E1 refers to
            the first of multiple possible overload resolution candidates and
            that candidate does not turn out to be the right one. The previous
            version also had code to compute Accum_Typ via a different method
            if the initial computation turned out to yield a universal numeric
            type. Delete that initial computation and use the second method in
            all cases.

Diff:
---
 gcc/ada/exp_attr.adb | 77 +++++++++++++++++++++++-----------------------------
 1 file changed, 34 insertions(+), 43 deletions(-)

diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index dddc05437b4..66fd6848a1d 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -6039,7 +6039,7 @@ package body Exp_Attr is
             E2  : constant Node_Id    := Next (E1);
             Bnn : constant Entity_Id  := Make_Temporary (Loc, 'B', N);
 
-            Accum_Typ : Entity_Id;
+            Accum_Typ : Entity_Id := Empty;
             New_Loop  : Node_Id;
 
             function Build_Stat (Comp : Node_Id) return Node_Id;
@@ -6058,7 +6058,6 @@ package body Exp_Attr is
 
             begin
                if Nkind (E1) = N_Attribute_Reference then
-                  Accum_Typ := Entity (Prefix (E1));
                   Stat := Make_Assignment_Statement (Loc,
                             Name => New_Occurrence_Of (Bnn, Loc),
                             Expression => Make_Attribute_Reference (Loc,
@@ -6069,14 +6068,12 @@ package body Exp_Attr is
                                 Comp)));
 
                elsif Ekind (Entity (E1)) = E_Procedure then
-                  Accum_Typ := Etype (First_Formal (Entity (E1)));
                   Stat := Make_Procedure_Call_Statement (Loc,
                             Name => New_Occurrence_Of (Entity (E1), Loc),
                                Parameter_Associations => New_List (
                                  New_Occurrence_Of (Bnn, Loc),
                                  Comp));
                else
-                  Accum_Typ := Etype (Entity (E1));
                   Stat := Make_Assignment_Statement (Loc,
                             Name => New_Occurrence_Of (Bnn, Loc),
                             Expression => Make_Function_Call (Loc,
@@ -6137,12 +6134,9 @@ package body Exp_Attr is
                       Statements =>
                         New_List (Build_Stat (Relocate_Node (Expr))));
 
-                  --  If the reducer subprogram is a universal operator, then
-                  --  we still look at the context to find the type for now.
+                  --  Look at the context to find the type.
 
-                  if Is_Universal_Numeric_Type (Accum_Typ) then
-                     Accum_Typ := Etype (N);
-                  end if;
+                  Accum_Typ := Etype (N);
                end;
 
             else
@@ -6172,43 +6166,40 @@ package body Exp_Attr is
                       Statements => New_List (
                         Build_Stat (New_Occurrence_Of (Elem, Loc))));
 
-                  --  If the reducer subprogram is a universal operator, then
-                  --  we need to look at the prefix to find the type. This is
+                  --  Look at the prefix to find the type. This is
                   --  modeled on Analyze_Iterator_Specification in Sem_Ch5.
 
-                  if Is_Universal_Numeric_Type (Accum_Typ) then
-                     declare
-                        Ptyp : constant Entity_Id :=
-                                 Base_Type (Etype (Prefix (N)));
+                  declare
+                     Ptyp : constant Entity_Id :=
+                              Base_Type (Etype (Prefix (N)));
 
-                     begin
-                        if Is_Array_Type (Ptyp) then
-                           Accum_Typ := Component_Type (Ptyp);
-
-                        elsif Has_Aspect (Ptyp, Aspect_Iterable) then
-                           declare
-                              Element : constant Entity_Id :=
-                                          Get_Iterable_Type_Primitive
-                                            (Ptyp, Name_Element);
-                           begin
-                              if Present (Element) then
-                                 Accum_Typ := Etype (Element);
-                              end if;
-                           end;
-
-                        else
-                           declare
-                              Element : constant Node_Id :=
-                                          Find_Value_Of_Aspect
-                                            (Ptyp, Aspect_Iterator_Element);
-                           begin
-                              if Present (Element) then
-                                 Accum_Typ := Entity (Element);
-                              end if;
-                           end;
-                        end if;
-                     end;
-                  end if;
+                  begin
+                     if Is_Array_Type (Ptyp) then
+                        Accum_Typ := Component_Type (Ptyp);
+
+                     elsif Has_Aspect (Ptyp, Aspect_Iterable) then
+                        declare
+                           Element : constant Entity_Id :=
+                                       Get_Iterable_Type_Primitive
+                                         (Ptyp, Name_Element);
+                        begin
+                           if Present (Element) then
+                              Accum_Typ := Etype (Element);
+                           end if;
+                        end;
+
+                     else
+                        declare
+                           Element : constant Node_Id :=
+                                       Find_Value_Of_Aspect
+                                         (Ptyp, Aspect_Iterator_Element);
+                        begin
+                           if Present (Element) then
+                              Accum_Typ := Entity (Element);
+                           end if;
+                        end;
+                     end if;
+                  end;
                end;
             end if;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-11-28  9:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-28  9:38 [gcc r14-5914] ada: Error compiling reduction expression with overloaded reducer subprogram Marc Poulhi?s

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).